0

我尝试使用 SetWindowsHookEx 和 WH_MOUSE 来捕获鼠标移动事件。它可以在任何地方工作,但在 HTCAPTION 区域(至少在我的代码示例中)。我找不到对这种行为的任何引用,我试图将 windbg 放入另一个应用程序,该应用程序执行相同的操作来监视鼠标移动。使用的方法也是 WH_MOUSE,即使鼠标在标题区域上也会生成事件。因此,它应该工作,但它没有。

有任何想法吗 ?

编辑:我正在使用它来挂钩所有进程。我构建了一个单独的 dll,将消息转发到我的应用程序中的某个内部窗口。我使用 dwThreadId = 0。我也没有在标题区域单击鼠标。

4

1 回答 1

0

我想到了 :

MouseHookProc 给 SetWindowsHookEx 的 mouseproc 接收鼠标的所有事件,这意味着我必须测试 wParam 是否等于 WM_MOUSE 或WM_NCMOUSEMOVE。当光标在客户区域上时 WM_MOUSE 被接收,当它在非客户区域上时 WM_NCMOUSEMOVE 被触发(就像在普通消息 proc 中一样)。

LRESULT CALLBACK MouseHookProc(int nCode, WORD wParam, DWORD lParam)
{
    if(nCode>=0 && (wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE))
    {
        if(!hwnd)
            hwnd=FindWindow(0, "MyWindow");

        MSLLHOOKSTRUCT *mhs=(MSLLHOOKSTRUCT*)lParam;        
        PostMessage(hwnd, WM_MOUSEHOOK, wParam, 0);
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}

我认为 WM_MOUSE 是某种对应的值,但不是真正的鼠标消息,但确实如此。

于 2009-06-15T15:53:09.313 回答