c++ - 为特定线程禁用 VS 调试器

标签 c++ visual-studio-2008 winapi debugging

我正在编写一些开源软件来捕获和处理原始鼠标和键盘事件。当一个事件被捕获时,我与一个 win32 窗口通信以准确询问如何处理该事件(即传递它或使用它)。它实际上与 HIDMacros 非常相似。

最终决定是否使用事件的部分实际上在我不控制的内存空间中运行(即 Windows 本身正在运行的东西)。这意味着,不幸的是,我几乎没有能力调试那部分代码。幸运的是,它是非常简单的代码,我还没有调试它。

另一方面,我有一个 Win32 事件循环在它自己的线程中运行,并处理上述代码部分发送的请求。所以上面的部分向这个窗口发送一条消息,它决定做什么,并返回一个答案。很简单。

问题是这样的。当我附加调试器时,只有 win32 窗口事件循环停止。其他代码继续运行,因为它不在我的实际内存或进程中。当用户执行诸如按 F10(进入下一行)之类的操作时,我注册的键盘 Hook 将 (1) 捕获击键,以及 (2) 调用我的 win32 窗口以获得一个回答。不幸的是,窗口被调试器卡住了。最终结果是:我按 F10,而 visual studio 从未接收到我的击键。 Visual Studio 本身停止响应所有输入,它卡住了,我必须杀死 VS 本身。

现在我已经通过使用超时设法在某种程度上解决了这个问题,但这真的很烦人(即非常明显)并且一点也不理想。我想知道的是,是否有一种编程方式可以从调试器中排除特定线程?有没有办法让 VS 调试器不要停止特定线程的执行?除此之外,有没有办法让调试器本身在暂停正常执行之前执行某个 Action ,并在恢复正常执行后再次执行?

这个库会在其他项目中使用。如果人们在调试时不会因为决定链接到我的库而突然失去使用键盘的能力,我真的很喜欢。 :) 感谢任何帮助,谢谢。

最佳答案

Hmya,您正在使用全局 Hook ,非常具有破坏性。您无法使用调试器执行任何操作,正是注入(inject)到 Visual Studio 中的 DLL 拷贝导致 SendMessageTimeout() 调用挂起。 IsDebuggerPresent() 不会有用。

一种可能的解决方法是检查 DLL 是在哪个进程中注入(inject)的。在获得的第一个回调中使用 GetModuleFileHandle,传递 NULL。如果你看到 devenv.exe 然后永远绕过一切。请注意,这是本地状态,而不是共享状态。

另一种方法是在第一次超时时切换模式。发生这种情况时绕过 SendMessage 调用一段时间(比如 5 分钟),这样这些超时就不再那么明显了。

关于c++ - 为特定线程禁用 VS 调试器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036624/

相关文章:

c++ - GetWindowText() 返回空字符串和奇怪的错误

visual-studio-2008 - 如何防止 Visual Studio 提示从 app.config 更新 .settings 文件

visual-studio-2008 - 加载解决方案时对 Visual Studio 2008 崩溃进行故障排除

c - 笔连接样式未应用于形状的所有角

c++ - 空引用错误,如何解决?

c++ - 模板代理方法无法编译

c++ - C/C++ Wavelet 库,非 GPL

c++ - 如何读取大量数字?

C# 列出目录中的文件问题

c++ - 如何在 C++ 中读取不包含在 ascii 中的字符?