我想问一个有关我遇到的问题的问题。

我使用以下功能安装了 WH_MOUSE 挂钩:

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

threadId 是使用 GetWindowThreadProcessId 函数获得的。这是成功的,因为该钩子(Hook)仅在我希望它执行的过程中起作用。 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 (我再次检查了)。我的问题是“鼠标按钮按下!”每次按住鼠标左键,该消息就会打印两次。鉴于提供的代码,为什么会发生这种情况?我目前正在使用一种解决方法,但想了解为什么会这样。

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

预先感谢您的任何回复。

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

最佳答案

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

关于c++ - MouseProc(WH_MOUSE)事件触发两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43192597/

10-11 22:42