PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)
如果hWnd为NULL,的PeekMessage检索 消息属于 到当前线程的任何窗口,并在当前线程的任何 消息 其hwnd值为NULL的消息队列 (请参阅MSG结构)。因此,如果 hWnd为NULL,则两个窗口消息和 线程消息被处理。通过包含在窗口消息和线程的消息命名管道接收
难道消息?
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
。
你可以提供一个简单的演示如何通过'MsgWaitForMultipleObjects'从管道读取数据结构,以及如何写入管道?我使用了'ReadFile'和'WriteFile',但它只能处理字符串。 – wamp 2010-08-23 03:18:24
我不这么认为。您需要执行ReadFile或等效功能。 – obelix 2010-08-23 03:08:54