【问题标题】:The PeekMessage function in C++ and named pipesC++ 中的 PeekMessage 函数和命名管道
【发布时间】:2011-04-02 10:48:32
【问题描述】:

关于:

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

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

通过命名管道接收的消息是否包含在窗口消息线程消息中?

【问题讨论】:

  • 我不这么认为。您需要执行 ReadFile 或等效操作。

标签: c++ winapi message named-pipes


【解决方案1】:

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

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

【讨论】:

  • 您能否提供一个简单的演示,如何通过MsgWaitForMultipleObjects从管道中读取数据结构,以及如何写入管道?我使用了ReadFileWriteFile,但它只能处理字符串。
【解决方案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);
}

【讨论】:

  • 能否提供一个简单的demo,如何通过MsgWaitForMultipleObjects从管道中读取数据结构?
  • 谢谢!但有几个奇迹,您的代码示例中的WAIT_OBJECT_0 是什么?我应该如何检索管道中的特定结构
  • 管道不传递结构。它们传送字节。 WAIT_OBJECT_0 仅表示等待句柄数组中的第一个对象处于警报状态 - 在这种情况下,等待句柄数组只有一个对象 hNamedPipe。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多