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

时间:2010-08-23 03:05:23

标签: c++ winapi message named-pipes

关于:

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

如果hWnd为NULL,则PeekMessage将检索   任何属于的窗口的消息   到当前的线程,以及任何   当前线程的消息   消息队列,其hwnd值为NULL   (参见MSG结构)。因此如果   hWnd为NULL,窗口消息和   处理主题消息

是否通过窗口消息主题消息中包含的命名管道接收消息?

2 个答案:

答案 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消息或数据,然后根据需要使用GetMessageReadFile