简体   繁体   中英

The PeekMessage function in C++ and named pipes

Regarding:

PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)

If hWnd is NULL, PeekMessage retrieves messages for any window that belongs to the current thread, and any messages on the current thread's message queue whose hwnd value is NULL (see the MSG structure). Therefore if hWnd is NULL, both window messages and thread messages are processed.

Are messages received via a named pipe included in window messages and thread messages ?

Definitely not. Named pipes do not send window messages.

The thread messages in this context are special and have nothing to do with named pipes.

Use MsgWaitForMultipleObjects instead.

CODE SAMPLE:

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);
}

No, Windows messages and named pipes are completely unrelated. You would need to use the MsgWaitForMultipleObjectsEx function to wait for either an incoming message or a message on the named pipe.

Note that MsgWaitForMultipleObjectsEx doesn't actually retrieve the message; check its return value to see if there's a Windows message or data on the named pipe, then use GetMessage or ReadFile as appropriate.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM