0

この Win32 メッセージング ループの中で何が起こっているのでしょうか? TranslateMessageキーコードをUTF charコードに変換してイベントを送信していることは理解していますが、正確WM_CHARには何を呼び出すのPeekMessageですか? 特定の種類のメッセージを除外して、それらのみを翻訳していますか?

// Application / Player message loop.
MSG msg;
ZeroMemory(&msg, sizeof(msg));

while(msg.message != WM_QUIT)
{
    if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

   // work happens here...
}
4

2 に答える 2

4

通常、メッセージ ループはGetMessageの代わりに使用しますPeekMessage。違いは、PeekMessageすぐに戻ることです。TRUEメッセージが削除された場合、またはメッセージFALSEがフェッチされなかった場合に返されます。一方、キューが空の場合、GetMessageメッセージが到着するまでブロックします。

ポイントは、作業がここで行われることを示すコメントです。おそらく作成者には、通常のブロッキング メッセージ ループでは不十分な何らかの理由があったのでしょう。問題のノンブロッキング メッセージ ループ コードの欠点は、ビジー ループであることです。アイドル状態にならないため、Sleep()切除した呼び出しなどがない限り、CPU を完全に消費します。

コメントでは、実際にはキーボード メッセージのみを出力し、特定のウィンドウのメッセージのみを出力したいと言っています。PeekMessage次のように呼び出す必要があります。

PeekMessage(&msg, hwnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)
于 2013-03-28T20:03:54.213 に答える
2

メッセージを取得するためのノンブロッキングな方法です。メッセージがあるかどうかを確認し、ある場合はキューから取り出して &msg に入れます。

ドキュメントを確認してください。

2 番目のパラメーターは、どのウィンドウを調べるかを示します。この場合は、「スレッド内のすべてのウィンドウ」です。

3 番目と 4 番目のパラメーターでは、キーボードまたはマウスのイベントが必要かどうかを指定できますが、現在は「all」に設定されています。

于 2013-03-28T20:00:51.587 に答える