簡體   English   中英

C ++中的PeekMessage函數和命名管道

[英]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消息或數據,然后根據需要使用GetMessageReadFile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM