gpt4 book ai didi

c++ - 有没有一种方法可以处理鼠标移动并执行 MessageBeep?

转载 作者:行者123 更新时间:2023-11-28 01:14:13 25 4
gpt4 key购买 nike

有没有办法识别鼠标移动?

我想在鼠标移动时采取一些 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。

1

如果鼠标停止移动,t1 != t2。 MessageBeep 将被调用。

2

如果您不需要控制台,请将 int main() 替换为 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

关于c++ - 有没有一种方法可以处理鼠标移动并执行 MessageBeep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59226249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com