GetMessageとPeekMessageの違い

2079 ワード


Win 32でGetMessageとPeekMessageの両方を使用して、プログラムに対して生成されたメッセージを取得することができる.
彼らにはどんな違いがありますか.
GetMessageの一般的な使い方はGetMessage(&msg,NULL,0,0);
これによりすべてのメッセージが受け入れられ、GetMessageはメッセージが生成されていないときに返されず、
メッセージが戻るまで待っています
メッセージがWMでない場合QUITでは、ゼロ以外の値を返します.つまり、WM_である場合QUITではゼロが返されます.
次のように使用します.
While(true)
{
if(GetMessage(&msg,NULL,0,0))
    break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}

問題が発生します.どんな問題が発生しますか.プログラムを終了すると、ウィンドウが終了します.
しかし、タスクマネージャに行ってみると、そのプロセスも見えます.
正しい使い方は次のとおりです.
While(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

PeekMessageは、メッセージがあるかどうかにかかわらず値を返します.メッセージがあるかどうかはゼロではありません.メッセージがないかどうかはゼロです.
ですから、上記のコードがPeekMessageであれば、このような問題は発生しません.
PeekMessageを使用する場合はメッセージの処理方法を指定する必要がありますが、一般的にPM_を使用します.REMOVE、メッセージを削除します.
PeekMessage(&msg,NULL,0,0,PM_REMOVE);
この関数を使用すると、CPUをずっと占有しています.一般的にはループさせていますから.
この関数はずっとメッセージを取り続けます.
もちろんこの2つの関数にはそれぞれメリットがあり、PeekMessageはメッセージを入力していないときにもいくつかのことを処理することができます.
この2つの関数の詳細:
BOOL GetMessage(
  LPMSG lpMsg,         //   MSG   
  HWND hWnd,           //           
  UINT wMsgFilterMin,  //          
  UINT wMsgFilterMax   //          
);

3番目に、4つのパラメータがゼロの場合、すべてのメッセージが取得されます.
パラメータ1やパラメータなどのエラーでポインタやハンドルが無効な場合は-1を返します.
BOOL PeekMessage(
  LPMSG lpMsg,        
  HWND hWnd,          
  UINT wMsgFilterMin, 
  UINT wMsgFilterMax,   //      GetMessage   
  UINT wRemoveMsg      //          
);

最後のパラメータはPM_NOREMOVEとPM_REMOVEの2つの方法は、メッセージを取り出した後にメッセージを削除しないことです.
この方式がどのような状況で採用されるか分からないが、私はまだ見たことがない.
一般的には、後者の削除方法が採用されています.
2つの関数には、主に次の2つの違いがあります.
    1.GetMessageは適切なメッセージがあるまで戻ってきますが、PeekMessageはメッセージキューを削除するだけです.
    2.GetMessageはメッセージをキューから削除し、PeekMessageは最後のパラメータwRemoveMsgを設定してメッセージをキューに保持するかどうかを決定します.
Windowsの内部ではGetMessageとPeekMessageが同じコードを実行しています.両者の最大の違いは、アプリケーションに戻るメッセージがない場合に現れます.この場合、PeekMessageはアプリケーションに空の値を返し、GetMessageはアプリケーションをスリープさせます.