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

标签 c++ windows winapi

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

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

相关文章:

c++ - 如何检查不是 "self"的进程的组成员身份?

python - 如何在 Windows 7 上启动 Python 文件?

winapi - LoadLibraryExW() 失败,最后一个错误是 ERROR_MOD_NOT_FOUND,但没有缺少依赖项?

c++ - Variabel 每次都会给出一个看似随机的答案

c++ - 将 Matlab 的 bsxfun 转换为 Eigen

c++ - 如何访问窗口的内部位图?

c++ - 如何读取特定单词之间的文本文件?

c++ - system() 函数找不到可执行文件的可能原因是什么?

c++ - Windows 8 拼写检查提供程序

c++ - Win32 有路径编辑控件吗?