MouseProc (WH_MOUSE) 事件触发两次

MouseProc (WH_MOUSE) events firing twice

本文关键字:两次 事件 MOUSE MouseProc WH      更新时间:2023-10-16

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

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

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

threadId是使用GetWindowThreadProcessId函数获取的。这是成功的,因为钩子只在我希望它的过程中工作。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 再次调用。