我想问一个关于我一直遇到的问题的问题。
我使用以下函数安装 WH_MOUSE 挂钩:
hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, dllInstance, threadId);
使用 GetWindowThreadProcessId 函数获取 threadId 。这很成功,因为钩子只能在我想要的过程中工作。 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 (我仔细检查)。我的问题是&#34;鼠标按钮向下!&#34;每次按住鼠标左键时,都会打印两次信息。为什么,鉴于提供的代码,这是否会发生?我目前正在使用解决方法,但想了解为什么会发生这种情况。
我在Visual Studio 2015中调试启动程序(调用包含 SetWindowsHookEx 的DLL函数的程序)并将其附加到我使用的进程(Debug - &gt; ;附加到流程)。
提前感谢您的回复。
编辑:似乎只是第一次调用过程nCode == HC_ACTION。我想这是我的问题的答案,但我想知道为什么我的程序第二次用nCode == HC_NOREMOVE调用?
答案 0 :(得分:0)
使用nCode == HC_NOREMOVE调用一次,然后使用nCode == HC_ACTION再调用一次。