c++ - 禁用特定线程的vs 调试器

  显示原文与译文双语对照的内容
0 0

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

最终决定是否部分或 NOT 消费事件实际上运行在一个内存空间,我做 NOT 控制( 例如 。 Windows 本身正在运行的内容。 也就是说,我几乎没有能力调试那段代码。 幸运的是它是非常简单的代码,我还没有调试它。

在另一方面,我有一个 WIN32 事件循环,它在自己的线程中运行,并处理前面部分代码所发送的请求。 因此上面的部分发送了一个消息,它决定做什么,并返回一个答案。 足够简单。

问题在于。在附加调试器时,仅停止 WIN32 窗口事件循环。 其他代码一直在运行,因为它在我的实际内存或者进程中是 NOT 。 当用户做一些类似的事情时,请按 F10 ( 单步进入下一行),我已经注册的键盘钩子将( 1 ) 捕捉到按键,( 2 ) 调用我的WIN32 窗口以获得一个答案。 不幸的是,这个窗口被调试器冻结了。 最终结果是:我按F10键,而 Visual Studio 从不收到我的按键。 Visual Studio 本身停止响应所有输入,它冻结,我必须杀死 vs 本身。

现在,我通过使用超时来解决这个问题,但它确实令人厌烦( 例如 。 非常可以感知的,而且 NOT 非常理想。 我想知道的是,是否有一种编程方法来从调试器中排除特定线程? 是否有方法要求 vs 调试器 NOT 停止特定线程的执行? 除这里之外,在暂停正常执行之前,是否有任何方法使调试器本身执行某个操作,然后再恢复正常执行。

这里库将在其他项目中使用。 我真的喜欢如果人们没有突然失去使用他们的键盘,而调试只是因为他们决定链接我的图书馆。 :) 感谢你的帮助,谢谢。

时间: 原作者:

0 0

Hmya你使用的是全球钩子非常混乱。 你不能对调试器执行任何操作,它是被注入到 Visual Studio 中的DLL的副本,它正在执行挂起的SendMessageTimeout() 调用。 IsDebuggerPresent() 不会有用的。

一个可能的解决办法是检查DLL被注入的进程。 在你获得的第一个回调上使用 GetModuleFileHandle,传递 NULL 。 如果你看到 devenv.exe,那么就永远忽略一切。 注意这是本地状态,不是共享的。

另一种方法是在第一次超时时使用 switch 模式。 当发生这样的情况时,跳过SendMessage调用,这样这些超时就不再被通知。

原作者:
0 0

你不是说你的超时值是什么,你不说你的过滤器进程正在做什么,但是我会使用SendMessageTimeout而不是普通的SendMessage,如果SendMessageTimeout的时间很长,就继续在钩子上继续。

0 0

vs 使用( 几乎所有的调试器)的调试器api将始终冻结整个进程。

...