有没有办法识别鼠标移动?
我想在鼠标移动时采取一些 Action ,
我做了一个谷歌搜索,发现它可以用 WM_MOUSEMOVE
来完成,WM_MOUSEMOVE
正在处理鼠标移动
但是当我使用 WM_MOUSEMOVE
时,没有任何反应。
我想让程序检测鼠标移动,然后调用 MessageBeep
。
示例:
LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch (msg)
{
case WM_CREATE: {
}
break;
case WM_DESTROY: {
PostQuitMessage(0);
}
break;
case WM_MOUSEMOVE: {
MessageBeep(MB_ICONERROR);
}
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
return 0;
}
它工作但有一个问题,它有点卡住,当我不移动鼠标时程序执行 MessageBeep
而且当我移动时鼠标程序有时执行 MessageBeep
有时没有。
我也尝试过使用 MessageBox
但现在它只是在屏幕的右上角使用 MessageBoxes
发送垃圾邮件,即使我没有移动鼠标也是如此。
最佳答案
从评论来看,你似乎不想局限于检测鼠标是否在程序中移动,你想在鼠标停止移动时调用那个哔哔声。
所以你可以通过设置 timer 来做到这一点和 hook .
An application installs the hook procedure by specifying the WH_MOUSE_LL hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function.
如果您不熟悉使用钩子(Hook),请不要担心。有专门的文档来解释如何使用钩子(Hook)。
不要忘记使用 GetLastInputInfo可以检索最后一次输入事件的时间。
请注意:此 GetLastInputInfo 函数会考虑所有输入事件,而不仅仅是鼠标事件。
如何使用GetLastInputInfo
?引用@Roger Rowland's answer .
详情请看我的代码。
#include <Windows.h>
#include <iostream>
#pragma comment(lib,"Winmm.lib")
using namespace std;
HHOOK mouseHook;
static DWORD t1;
DWORD GetIdleTime()
{
LASTINPUTINFO pInput;
pInput.cbSize = sizeof(LASTINPUTINFO);
if (!GetLastInputInfo(&pInput))
{
// report error, etc.
}
return pInput.dwTime;
}
void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
{
DWORD t2 = GetIdleTime();
if (t2 != t1) //When the mouse is moving, t1 == t2
{
MessageBeep(MB_ICONERROR);
}
cout << "t1: " << t1 << endl; //For test
cout << "t2: " << t2 << endl;
cout << endl;
}
LRESULT __stdcall MouseHookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
Sleep(10); //Used to correct the value of t1
t1 = GetIdleTime();
}
return CallNextHookEx(mouseHook, nCode, wParam, lParam);
}
void SetHook()
{
if (!(mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookCallback, NULL, 0)))
{
cout << "Failed to install mouse hook!" << endl;
}
}
void ReleaseHook()
{
UnhookWindowsHookEx(mouseHook);
}
int main()
{
SetHook(); //Install hook
SetTimer(NULL, 0, 3000, (TIMERPROC)&f); //Check every three seconds
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
调试:
如果鼠标在移动,t1 == t2。
如果鼠标停止移动,t1 != t2。 MessageBeep
将被调用。
如果您不需要控制台,请将 int main()
替换为 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
关于c++ - 有没有一种方法可以处理鼠标移动并执行 MessageBeep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59226249/