MouseProc (WH_MOUSE) 事件触发两次
MouseProc (WH_MOUSE) events firing twice
我想问一个关于我遇到的问题的问题。
我使用以下函数安装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 再次调用。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- MouseProc (WH_MOUSE) 事件触发两次
- NodeJS 文件系统 监视抛出事件两次或更多次
- 当事件循环在错误槽启动时,ContentNotFoundError发生时,QNetworkReply发出两次错误信号
- 为什么我在使用ReadConsoleInput时接收每个键盘事件两次?