MouseProc(WH_MOUSE)事件触发两次

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

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

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

threadId是使用GetWindowThreadProcessId函数获得的。 这是成功的,因为钩子只在我想要的过程中起作用。 dllInstanceDllMain入口点获取。 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); } 

在testing时, isRunning()返回TRUE (我重复检查)。 我的问题是,“鼠标button!” 每次按住鼠标左键时,消息将被打印两次。 为什么给定的代码,这是否发生? 我目前正在使用一种解决方法,但想知道为什么发生这种情况。

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

预先感谢任何回应。

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

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