【问题标题】:SetWindowsHookEx with WH_MOUSE not capturing mouse moves over HTCAPTION area带有 WH_MOUSE 的 SetWindowsHookEx 未捕获鼠标在 HTCAPTION 区域上的移动
【发布时间】:2009-06-02 15:17:03
【问题描述】:

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

有什么想法吗?

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

【问题讨论】:

    标签: winapi hook


    【解决方案1】:

    我想通了:

    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 是某种对应的值,但不是真正的鼠标消息,但确实如此。

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 2012-06-15
      • 2013-11-06
      • 1970-01-01
      • 2011-02-05
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多