低级鼠标挂钩-鼠标在断点处冻结
Low level mouse hook - mouse freeze on breakpoint
我想自己绘制和移动我的窗口(使用chromium嵌入式框架)。要做到这一点,当鼠标在我的窗口外移动时,我需要一个全局回调——所以我安装了一个低级别的鼠标挂钩:
hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, hInstance, NULL);
钩子简单地抓取鼠标事件并调用"CallNextHookEx"。这里没有问题,一切都很顺利。我现在的问题是:如果调试器坏了或者抛出了异常,我就不能再移动鼠标了。。
我试着在另一个线程中处理钩子,就像这样:
HANDLE mouseProcHandle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)mouseProcessor, NULL, NULL, &dwMouseProcThread);
DWORD WINAPI Win32Application::mouseProcessor(LPVOID lpParm) {
hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, ((Win32Application*)Application::getInstance())->hInstance, NULL);
MSG message;
while (GetMessage(&message, NULL, 0, 0)) {
TranslateMessage(&message);
DispatchMessage(&message);
}
UnhookWindowsHookEx(hMouseLLHook);
return 0;
}
但这也不能解决问题。有没有变通方法、解决方案或其他方法可以做到这一点?此外,我认为低级别的钩子可能没有必要,因为我只需要被告知移动,如果我是最后一个排队的人,那也不会有问题,所以系统/其他进程可以首先处理鼠标回调。
为了进一步阐明这一点:当您拦截所有鼠标移动事件时,它们都会出现在您的钩子中,钩子可以修改或吞噬它们。因此,系统会调用钩子中的每个鼠标移动事件,并等待钩子例程完成,直到它再次为下一个挂起的鼠标移动事件调用钩子。
猜猜当你在钩子事件中闯入调试器时会发生什么?在完成挂钩程序之前,不再发生鼠标事件。通常情况下,你可以用这样一个中心钩来摧毁你的整个系统。但幸运的是,Windows确实预料到了糟糕的挂钩。您会注意到,在一段时间后,系统会再次响应鼠标事件。我的猜测是,当Windows挂起一次时,它会简单地删除你的钩子。
现在关于调试:安全进入调试器的唯一方法是在挂钩后永远不要触摸鼠标。不太实用。唯一的方法是跟踪有趣的事情,并查看日志文件中钩子内部发生了什么。如果你正在研究如何勾选鼠标和键盘事件的示例代码,你可以看看这里:
http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/Hooking/Hooker.cs
当调试器停止整个程序(它的所有线程)时
如果使用钩子,可能没有解决方法
不那么准确,但您可以在线程中轮询GetCursorPos。
- WinAPI挂钩鼠标
- 无法删除指针,已触发断点
- 条件断点在不应该触发时触发
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- 跟踪滚动条上的鼠标事件
- SendInput()鼠标移动计算
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何在鼠标挂钩过程中检测拖动
- Win32 发送输入鼠标移动滞后并冻结
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- GDB 断点在 Mac 上是不准确的
- 在 macOS 中使用 C/C++ 设置鼠标光标图像
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 在 vscode 中运行时无法暂停或设置断点
- 如何在QSplashScreen中禁用鼠标单击
- C++鼠标单击时的屏幕截图不起作用
- 不会命中此断点
- 低级鼠标挂钩-鼠标在断点处冻结