我想问一个有关我遇到的问题的问题。
我使用以下功能安装了 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/