我正在编写一些代码来监视第三方调试查看器(即DbgView)是否正在运行。我可以使用Debugger.IsAttached轻松处理完整的调试器,但是要跟踪DbgView,您需要监视某些事件。我的代码基于这篇文章:http://unixwiz.net/techtips/outputdebugstring.html
所以,现在,我有:
IntPtr h1 = CreateEvent(IntPtr.Zero, false, false, "DBWIN_BUFFER_READY");
WaitForSingleObject(h1, 0xFFFFFFFF);
//bool b2 = h1 != IntPtr.Zero;
CloseHandle(h1);
效果很好。代码阻塞,直到DbgView启动并开始捕获。正是我想要的。现在的问题是,我无法判断捕获何时停止。
有没有办法检查重置或释放事件的时间或DbgView正在做什么?最好不要在循环中轮询事件:)。
答案 0 :(得分:1)
有没有办法检查事件重置的时间?
不,没有。您可以等待设置事件,但不能重置。你需要在那里举办另一个你可以等待的活动。
阅读了您链接的文章后,该协议中没有任何内容可以为您提供检测捕获结束的方法。
您正在等待的事件并非旨在用于您使用它的目的。调试器使用此事件及其朋友DBWIN_DATA_READY
与OutputDebugString
进行通信。
这样做的一个结果是,任何捕获OutputDebugString
的调试器都将创建这些事件。因此,您当前的方法几乎可以找到任何调试器,而不仅仅是DbgView。
你现有的代码看起来很可疑。如果事件尚不存在,您的代码将创建它。然后,您将等待它发出信号,这可能永远不会发生。您可能永远不会遇到这种情况,因为您只能在调试器处于活动状态时运行。您使用魔术常量而不是INFINITE
,并且根本不执行错误检查。