MouseProc(WH_MOUSE)事件触发两次

时间:2017-04-03 19:16:46

标签: c++ windows dll

我想问一个关于我一直遇到的问题的问题。

我使用以下函数安装 WH_MOUSE 挂钩:

hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, dllInstance, threadId);

使用 GetWindowThreadProcessId 函数获取 threadId 。这很成功,因为钩子只能在我想要的过程中工作。 dllInstance 是从 DllMain 入口点获取的。对于它的价值, hMouseHook 位于共享数据段( #pragma data_seg(" .shared"))。以下代码显示了上面 SetWindowsHookEx 调用中提供的 MouseHookProc

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode < 0 || !isRunning())
        return CallNextHookEx(hMouseHook, nCode, wParam, lParam);

    switch (wParam) {
        case WM_LBUTTONDOWN: {
            OutputDebugStringA("Mouse button down!\n");
            break;
        }
    }

    return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

测试时, isRunning()返回 TRUE (我仔细检查)。我的问题是&#34;鼠标按钮向下!&#34;每次按住鼠标左键时,都会打印两次信息。为什么,鉴于提供的代码,这是否会发生?我目前正在使用解决方法,但想了解为什么会发生这种情况。

我在Visual Studio 2015中调试启动程序(调用包含 SetWindowsHookEx 的DLL函数的程序)并将其附加到我使用的进程(Debug - &gt; ;附加到流程)。

提前感谢您的回复。

编辑:似乎只是第一次调用过程nCode == HC_ACTION。我想这是我的问题的答案,但我想知道为什么我的程序第二次用nCode == HC_NOREMOVE调用?

1 个答案:

答案 0 :(得分:0)

使用nCode == HC_NOREMOVE调用一次,然后使用nCode == HC_ACTION再调用一次。