2010-08-23 46 views
4

关于:所述的PeekMessage函数C++和命名管道

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

如果hWnd为NULL,的PeekMessage检索 消息属于 到当前线程的任何窗口,并在当前线程的任何 消息 其hwnd值为NULL的消息队列 (请参阅MSG结构)。因此,如果 hWnd为NULL,则两个窗口消息线程消息被处理。通过包含在窗口消息线程的消息命名管道接收

难道消息?

+1

我不这么认为。您需要执行ReadFile或等效功能。 – obelix 2010-08-23 03:08:54

回答

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

你可以提供一个简单的演示如何通过'MsgWaitForMultipleObjects'从管道读取数据结构吗? – wamp 2010-08-23 03:15:48

+0

谢谢!但是有一些奇迹,代码示例中的WAIT_OBJECT_0是什么?我应该如何检索管道中的特定**结构**? – wamp 2010-08-23 04:00:39

+1

管道不传达结构。他们传达字节。而WAIT_OBJECT_0只是意味着等待句柄数组中的第一个对象处于惊动状态 - 在这种情况下,等待句柄数组只有一个对象hNamedPipe。 – bdonlan 2010-08-23 05:07:47

1

不,Windows消息和命名管道是完全无关的。您需要使用MsgWaitForMultipleObjectsEx函数来等待传入消息或命名管道上的消息。

请注意,MsgWaitForMultipleObjectsEx实际上并未检索到该消息;检查其返回值以查看命名管道上是否有Windows消息或数据,然后酌情使用GetMessageReadFile

+0

你可以提供一个简单的演示如何通过'MsgWaitForMultipleObjects'从管道读取数据结构,以及如何写入管道?我使用了'ReadFile'和'WriteFile',但它只能处理字符串。 – wamp 2010-08-23 03:18:24