2011-07-06 2 views
0

내가 가지고있는 기능이 코드 실행됩니다 (나에 의해 정의 WM_ONDATA) 메시지에 의해 트리거 기능 :하나의 메시지 남기고 모두 처리 할 창에게

MSG msg; 
while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
{ 

    if(!AfxGetApp()->PumpMessage()) 
    { 
     ::PostQuitMessage(0); 
     return 0; 
    } 
} 
return 1; 

문제는 메시지 큐에있을 수 있다는 것입니다을 함수를 트리거 할 수있는 또 다른 메시지입니다.

WM_ONDATA가 아닌 모든 메시지를 처리 ​​할 수 ​​있는지 궁금합니다.

+0

여기에 디자인에 문제가있는 것 같습니다. –

+1

이것은 PostMessage가 SendMessage와 같이 작동하도록하는 매우 정교한 방법입니다. 그냥 SendMessage를 사용하십시오. –

답변

0

메시지를 무시하거나 실행 대기열로 만들려면 proc 창을 가져올 수 있습니다. 그냥 재귀을 피하기 위해 찾는 경우 재입국은

class MyDlg : ... 
{ 
     MyDlg(...) : m_inOnData(false), ... { .... } 

     ... 
    private: 
     BOOL m_inOnData; 
}; 

잠글 수 있습니다 .... 일이 예외가 안전하고 약간 수 있도록

void MyDlg::OnOnData(...) 
{ 
     if (m_inOnData) 
      return; 
     m_inOnData = TRUE; 
     .... 

     m_inOnData = FALSE; 
} 

당신은 (범위가 지정된 RIIA 구조체와 함께 멋진 얻을 수 덜 자세한 정보)

0

확실히 - 수령 후 msg에있는 메시지 번호를 확인하십시오.

3

PeekMessage의 세 번째 및 네 번째 매개 변수는 메시지 값의 범위를 지정할 수 있습니다. 해당 범위를 벗어난 메시지는 처리되지 않습니다.

while (PeekMessage(&msg, NULL, 0, WM_ONDATA - 1, PM_NOREMOVE) 
    || PeekMessage(&msg, NULL, WM_ONDATA + 1, 0xffff, PM_NOREMOVE)) 
+0

메시지에 문제가있을 수 있습니다. 모든 0..WM_ONDATA-1 메시지가 먼저 수행되고 모든 WM_ONDATA + 1..0xffff가 처리됩니다. 그것은 중요하지 않을 수 있습니다. –

관련 문제