4


1

C ++および名前付きパイプのPeekMessage関数

について:

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

_ hWndがNULLの場合、PeekMessageは、現在のスレッドに属するウィンドウのメッセージ、およびhwnd値がNULLである現在のスレッドのメッセージキューのメッセージを取得します(MSG構造体を参照)。 したがって、hWndがNULLの場合、* window messages thread messages *の両方が処理されます。 _

名前付きパイプ経由で受信したメッセージは、* window messages および thread messages *に含まれていますか?

2 Answer


2


絶対にありません。 名前付きパイプはウィンドウメッセージを送信しません。

このコンテキストのスレッドメッセージは特別であり、名前付きパイプとは関係ありません。

代わりにhttp://msdn.microsoft.com/en-us/library/ms684242%28VS.85%29.aspx[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


いいえ、Windowsメッセージと名前付きパイプは完全に無関係です。 着信メッセージまたは名前付きパイプ上のメッセージを待機するには、http://msdn.microsoft.com/en-us/library/ms684245(VS.85).aspx [MsgWaitForMultipleObjectsEx]関数を使用する必要があります。

MsgWaitForMultipleObjectsEx`は実際にメッセージを取得しないことに注意してください。その戻り値をチェックして、名前付きパイプにWindowsメッセージまたはデータがあるかどうかを確認し、必要に応じて `GetMessage`または ReadFile`を使用します。