Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 禁用特定线程的VS调试器_C++_Visual Studio 2008_Winapi_Debugging - Fatal编程技术网

C++ 禁用特定线程的VS调试器

C++ 禁用特定线程的VS调试器,c++,visual-studio-2008,winapi,debugging,C++,Visual Studio 2008,Winapi,Debugging,我正在编写一些开源软件来捕获和处理原始鼠标和键盘事件。捕获事件时,我会与win32窗口通信,精确询问如何处理事件(即传递或使用事件)。它实际上与HIDMacros非常相似 最终决定是否使用事件的部分实际上运行在我无法控制的内存空间中(即Windows本身正在运行的部分)。这意味着,不幸的是,我几乎没有能力调试这段代码。幸运的是,这是非常简单的代码,我还没有调试它 另一方面,我在自己的线程中运行了一个Win32事件循环,并处理上述代码部分发送的请求。因此,上面的部分向这个窗口发送一条消息,它决定要

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

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

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

问题是这个。当我附加调试器时,只有win32窗口事件循环停止。另一个代码保持正常运行,因为它不在我的实际内存或进程中。当用户按F10键(跳到下一行)时,我注册的键盘挂钩将(1)捕捉击键,(2)调用win32窗口以获得答案。不幸的是,调试器冻结了窗口。最终的结果是:我按下F10,VisualStudio从未收到我的击键。VisualStudio本身停止响应所有输入,它冻结,我必须杀死VS本身

现在,我已经设法通过使用超时来解决这个问题,但它真的很烦人(也就是说,很容易察觉),一点也不理想。我想知道的是,有没有一种编程方法可以从调试器中排除特定线程?有没有办法要求VS调试器不要停止特定线程的执行?除此之外,有没有办法让调试器本身在暂停正常执行之前执行某个操作,然后在恢复正常执行之后再次执行


此库将用于其他项目。如果人们在调试时不会因为决定链接到我的库而突然失去使用键盘的能力,我真的会很高兴非常感谢您的帮助。

您没有确切说明超时的具体操作,您也没有确切说明筛选进程的具体操作,但我会使用SendMessageTimeout而不是普通的SendMessage,超时值相当低,然后,如果SendMessageTimeout超时,只需在钩子中继续。VS使用的调试器api(以及几乎所有其他调试器)将始终冻结整个过程

Hmya,您正在使用全局钩子,非常具有破坏性。对于调试器,您无能为力,正是注入Visual Studio的DLL副本挂起了SendMessageTimeout()调用。IsDebuggerPresent()将不再有用

一种可能的解决方法是检查DLL被注入哪个进程。在得到的第一个回调上使用GetModuleFileHandle,并传递NULL。如果您看到devenv.exe,那么将永远忽略所有内容。请注意,这是本地状态,而不是共享状态


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

如果您对代码感兴趣,可以在“谢谢”中找到它。我也这么想,但我觉得值得一问。我希望可能会有一些#pragma或一些奇怪的低级线程调用,它会告诉调试器,“别管这个线程,没什么好担心的。”事实上,这正是我现在采取的方法。很高兴知道我没有完全偏离基准:)谢谢。