我想问一个关于我遇到的问题的问题。
我使用以下函数安装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); }
在testing时, isRunning()返回TRUE (我重复检查)。 我的问题是,“鼠标button!” 每次按住鼠标左键时,消息将被打印两次。 为什么给定的代码,这是否发生? 我目前正在使用一种解决方法,但想知道为什么发生这种情况。
我在Visual Studio 2015中debugging启动程序(调用DLL的函数包含SetWindowsHookEx ),并将其附加到我正在使用的过程(debugging – >附加到进程)。
预先感谢任何回应。
编辑:这似乎只有第一次被称为nCode == HC_ACTION的过程。 我想这是我的问题的答案,但我想知道为什么我的程序被调用nCode == HC_NOREMOVE第二次?
用nCode == HC_NOREMOVE调用一次,然后再用nCode == HC_ACTION调用。