0

ウィンドウ プロシージャにディスパッチする直前に、メッセージ ループ内のメッセージを読み上げたいと考えていました。このように読み取ろうとしたほとんどのメッセージは正しく読み取られましたが、ウィンドウを閉じると、WM_CLOSEまたはWM_DESTROYメッセージが受信されなかったかのように読み取れませんでした。これが私がすることです:

void Framework::Run(){
while(running){

    MSG msg;
    while(PeakMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        switch(msg.message){
            case WM_DESTROY:
                PostQuitMessage(0);
                break;
            case WM_QUIT:
                running = false;
                break;
        //...other cases...
        }
        DispatchMessage(&msg);
    }
//...
}
}

最初のケースにブレークポイントを設定しましたが、(「X」をクリックして) ウィンドウを閉じてもブレークポイントにヒットしません。ただし、ウィンドウプロシージャで確認するとWM_DESTROY、読み込まれ、すべてがうまくいきます。外に出ないのはなぜですか?

そのようなメッセージはウィンドウ プロシージャに直接送信されますか? どのように?

4

1 に答える 1

3

メッセージ ループは、メッセージ キューにポストされたメッセージのみを表示します。すべてのメッセージがメッセージ キューを通過するわけではありません。 WM_DESTROYはそのようなメッセージの 1 つです。代わりにすべきことは、メッセージがメッセージ キューを通過したかどうかにかかわらず、ウィンドウが受信するすべてのメッセージを表示するように、ウィンドウ プロシージャでメッセージを処理することです。

自分で作成していないウィンドウ、またはシステム提供のウィンドウ プロシージャを持つ標準ウィンドウのメッセージを表示する必要がある場合は、 を使用してウィンドウをサブクラス化SetWindowSubclass()できます。

于 2014-09-28T15:02:13.837 に答える