Функция PeekMessage в C ++ и именованные каналы - PullRequest
4 голосов
/ 23 августа 2010

Относительно:

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

Если hWnd равен NULL, PeekMessage извлекает сообщения для любого окна, принадлежащего текущему потоку, и любых сообщений в очереди сообщений текущего потока, чье значение hwnd равно NULL (см. структуру МГЗС).Поэтому, если hWnd равен NULL, обрабатываются оба оконных сообщения и потоковых сообщений .

Являются ли сообщения, полученные через именованный канал, включенными в оконные сообщения и цепочка сообщений ?

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Определенно нет. Именованные каналы не отправляют оконные сообщения.

Сообщения потоков в этом контексте являются особыми и не имеют ничего общего с именованными каналами.

Вместо этого используйте 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 голос
/ 23 августа 2010

Нет, сообщения Windows и именованные каналы полностью не связаны.Вам нужно было бы использовать функцию MsgWaitForMultipleObjectsEx для ожидания входящего сообщения или сообщения в именованном канале.

Обратите внимание, что MsgWaitForMultipleObjectsEx фактически не получает сообщение;проверьте возвращаемое значение, чтобы увидеть, есть ли сообщение Windows или данные в именованном канале, затем используйте GetMessage или ReadFile в зависимости от ситуации.

...