VistaではメッセージキューにWM_QUITしかない場合、WaitMessage()が制御を返さないようです。(実際にはWM_QUITはキューには溜まらずにフラグが立つだけですが)
例えば次のようなコードで問題が発生します。
for(;;) { WaitMessage(); if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } }
このコードでもXPでは問題ないのですが、Vistaではアプリケーションを終了する際に、メッセージキューが空になり後はWM_QUITだけとなったところでWaitMessage()が処理を返さず、そのままゾンビプロセス化してしまいます。
私がCG系の技術デモを作るときは、アプリケーションがアクティブなときは全力で情報を更新しつつPeekMessageでウインドウメッセージを処理し、非アクティブになったら更新を止めてWaitMessageでメッセージを待つという方法をよく使っていましたが、非アクティブな状態でのメッセージループは上記のものと等価なコードになっています。そのため、非アクティブな状態で閉じようとすると、ゾンビプロセス化してしまいます。
これってどう考えても、仕様ではなくバグですよね?
タグ:Win32API

