2011-07-06 10 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

これは、SendMessageのようにPostMessageを動作させるためには、とても精巧な方法です。 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の3番目と4番目のパラメータは、メッセージ値の範囲を指定できることを思い出してください。その範囲外のメッセージは処理されません。

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が処理されます。それは問題ではないかもしれません。 –

関連する問題