C++ MouseProc(WH_鼠标)事件触发两次

C++ MouseProc(WH_鼠标)事件触发两次,c++,windows,dll,C++,Windows,Dll,我想问一个关于我遇到的问题的问题 我使用以下功能安装了一个WH_鼠标挂钩: hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, dllInstance, threadId); threadId是使用GetWindowThreadProcessId函数获得的。这是成功的,因为钩子只在我想要的过程中起作用。dllInstance从DllMain入口点获得。值得一提的是,hMouseHook位于共享数据段(#pragma

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

我使用以下功能安装了一个WH_鼠标挂钩:

hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, dllInstance, threadId);
threadId是使用GetWindowThreadProcessId函数获得的。这是成功的,因为钩子只在我想要的过程中起作用。dllInstanceDllMain入口点获得。值得一提的是,hMouseHook位于共享数据段(#pragma data_seg(“.shared”))。以下代码显示了在上述调用中提供的鼠标hookproc

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);
}
LRESULT回调MouseHookProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM){
如果(nCode<0 | |!isRunning())
返回CallNextHookEx(hMouseHook、nCode、wParam、lParam);
交换机(wParam){
案例WM_LBUTTONDOWN:{
OutputDebugStringA(“鼠标按钮按下!\n”);
打破
}
}
返回CallNextHookEx(hMouseHook、nCode、wParam、lParam);
}
测试时,isRunning()返回TRUE(我仔细检查)。我的问题是每次按下鼠标左键时,“鼠标按下!”消息会打印两次。鉴于提供的代码,为什么会发生这种情况?我目前正在使用一种变通方法,但想了解为什么会发生这种情况

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

提前感谢您的回复


Edit:这似乎只是第一次将该过程称为nCode==HC\u ACTION。我想这是我问题的答案,但我想知道为什么我的过程用nCode==HC\u-NOREMOVE第二次调用?

用nCode==HC\u-NOREMOVE调用一次,然后再用nCode==HC\u-ACTION调用一次。

我的期望是
HC\u-NOREMOVE
调用(
peek消息
PM\u NOREMOVE
调用)第一个。我不知道为什么是第二个调用。你可以忽略任何带有
HC\u NOREMOVE
标志的调用。这是完全正常的,@1201程序事实上,我只是羞耻地假设它是第二个,没有检查。你是对的,HC\u NOREMOVE是第一个。现在我的问题仍然是,为什么我的过程得到cal带有HC_NOREMOVE消息的led?此代码的用途是什么?@Hans Passant我知道这些代码都有文档记录,但我在哪里可以找到有关HC_NOREMOVE消息代码用途的信息?