我有一个内核驱动程序检测进程创建,有一个应用程序来显示结果。我正在使用WaitForSingleObject(event, INFINITE)
来检测流程创建。
它在控制台应用程序中运行良好,但当我将其添加到GUI应用程序时,整个应用程序冻结了。我怀疑这是由WaitForSingleObject
引起的,经过一些谷歌搜索,我尝试使用MsgWaitForMultipleObjects
,但它没有用完。
编辑:我正在使用C ++ Windows窗体应用程序
我必须继续等待,因为我正在监视"永远"而不只是一次性活动..
如果您需要,我可以提供代码或更多信息, 将感激任何形式的帮助,谢谢!
我在我的C ++ winform应用程序的头文件中完成了以下操作:
*请注意myEvent = ::OpenEventW(....);
while (true)
{
switch (::MsgWaitForMultipleObjects(
1, &myEvent, FALSE,
INFINITE, QS_ALLINPUT)
)
{
case WAIT_OBJECT_0:
{
//do my stuff (send IOCTL to driver and stuff)
}
case (WAIT_OBJECT_0 + 1):
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
break;
}
}
}
但是,它会继续进入交换机的默认部分。我做错了什么?
答案 0 :(得分:3)
MsgWaitForMultipleObjects
绝对有效,但您必须了解 的工作原理。它将返回事件或到达的消息。这些消息是让您的应用程序免于冻结所需的信息。但是你必须处理这个消息:
GetMessage(&msg, 0, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
答案 1 :(得分:1)
假设这是C ++和MFC GUI应用程序,内部代码中有一个循环,用于检索消息并调用您在C ++主代码中提供的函数来处理Windows消息(相当于GetMessage() ... C windows程序中的DispatchMessage())。如果线程执行Wait ...(),则该循环停止。
一个可能的解决方法是生成一个线程并让它执行Wait ...()并选择性地将Windows消息发送到主线程,这样常规的消息处理接口可以继续用于你的“帮手”线程。
我不确定细节,但是这里的某些人可能会提供帮助,或者可能是msdn论坛或msdn文章。