Функция PeekMessage в С++ и именованных каналах

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

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

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

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

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


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

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

licensed under cc by-sa 3.0 with attribution.