[英]The PeekMessage function in C++ and named pipes
關於:
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)
如果hWnd為NULL,則PeekMessage將檢索屬於當前線程的任何窗口的消息,以及當前線程的消息隊列中hwnd值為NULL的任何消息(請參閱MSG結構)。 因此,如果hWnd為NULL,則處理窗口消息和線程消息 。
是否通過窗口消息和線程消息中包含的命名管道接收消息 ?
當然不。 命名管道不發送窗口消息。
此上下文中的線程消息是特殊的,與命名管道無關。
請改用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);
}
不,Windows消息和命名管道完全不相關。 您需要使用MsgWaitForMultipleObjectsEx函數來等待傳入消息或命名管道上的消息。
請注意, MsgWaitForMultipleObjectsEx
實際上並不檢索消息; 檢查其返回值以查看命名管道上是否有Windows消息或數據,然后根據需要使用GetMessage
或ReadFile
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.