2010-08-23 3 views
4

: HWND가 NULL 인 경우를 PeekMessage는 현재 스레드에 을 속한 윈도우 메시지를 검색 ++ C의를 PeekMessage 함수 및 명명 된 파이프

PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) 
, 현재의 thread의에 어떤 메시지 hwnd 값이 NULL 인 메시지 큐 (MSG 구조 참조). 따라서 hWnd가 NULL 인 경우 창 메시지스레드 메시지이 처리됩니다.

메시지는 윈도우 메시지스레드 메시지에 포함 된 명명 된 파이프를 통해 수신?

+1

나는 그렇게 생각하지 않는다. 당신은 ReadFile이나 그와 동등한 것을 할 필요가 있습니다. – obelix

답변

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

'MsgWaitForMultipleObjects'에 의해 파이프에서 데이터 구조를 읽는 방법을 간단한 데모로 제공 할 수 있습니까? – wamp

+0

감사합니다!하지만 몇 가지 놀라운 점은 코드 샘플에서 WAIT_OBJECT_0이 무엇인가요? 파이프에서 특정 구조 **를 어떻게 검색해야합니까? – wamp

+1

파이프는 구조물을 운반하지 않습니다. 그들은 바이트를 전달합니다. WAIT_OBJECT_0은 대기 핸들 배열의 첫 번째 객체가 경고 상태임을 의미합니다.이 경우 대기 핸들 배열에는 하나의 객체 인 hNamedPipe 만 있습니다. – bdonlan

1

아니, Windows 메시지 및 명명 된 파이프는 전혀 관련이 있습니다. 들어오는 메시지 나 명명 된 파이프의 메시지를 기다리려면 MsgWaitForMultipleObjectsEx 함수를 사용해야합니다.

MsgWaitForMultipleObjectsEx은 실제로 메시지를 검색하지 않습니다. 반환 값을 검사하여 명명 된 파이프에 Windows 메시지 또는 데이터가 있는지 확인한 다음 GetMessage 또는 ReadFile을 적절하게 사용하십시오.

+0

'MsgWaitForMultipleObjects'에 의해 파이프에서 데이터 구조를 읽는 방법과 파이프에 쓰는 방법을 간단한 데모로 제공 할 수 있습니까? 'ReadFile'과'WriteFile'을 사용했지만 문자열 만 처리 할 수 ​​있습니다. – wamp