关于:
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)
如果hWnd为NULL,则PeekMessage将检索 任何属于的窗口的消息 到当前的线程,以及任何 当前线程的消息 消息队列,其hwnd值为NULL (参见MSG结构)。因此如果 hWnd为NULL,窗口消息和 处理主题消息。
是否通过窗口消息和主题消息中包含的命名管道接收消息?
答案 0 :(得分:2)
绝对不是。命名管道不发送窗口消息。
此上下文中的线程消息是特殊的,与命名管道无关。
改为使用MsgWaitForMultipleObjects。
代码示例:
void MessageLoop(HANDLE hNamedPipe)
{
do {
DWORD res = MsgWaitForMultipleObjects(1, &hNamedPipe, INFINITE, QS_ALLEVENTS, MWMO_INPUTAVAILABLE);
if (res == WAIT_OBJECT_0) {
/* Handle named pipe -- at this point ReadFile will not block */
} else if (res == WAIT_OBJECT_0 + 1) {
MSG msg;
if (!GetMessage(&msg, NULL, 0, 0))
break; /* WM_QUIT */
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} while (1);
}
答案 1 :(得分:1)
不,Windows消息和命名管道完全不相关。您需要使用MsgWaitForMultipleObjectsEx函数来等待传入消息或命名管道上的消息。
请注意,MsgWaitForMultipleObjectsEx
实际上并未检索到该消息;检查其返回值以查看命名管道上是否有Windows消息或数据,然后根据需要使用GetMessage
或ReadFile
。