3

多くのアプリケーションと同様に、私のものは複数のウィンドウを作成します。作成されたウィンドウの数がわからず、追跡することもできないため、作成されたウィンドウがない時期もわかりません。

私の問題は、すべてのウィンドウが閉じられている場合、PostQuitMessage何らかの方法で呼び出さない限り、アプリケーションはウィンドウを開いたまま実行し続けることです (明らかに)。PostQuitMessageメッセージに応答してメッセージハンドラーを呼び出すことはできません。これWM_DESTROYは、最初のウィンドウが閉じられたときにすべてのウィンドウが閉じられるためです。他の20のウィンドウがまだ開いている場合でも。

PostQuitMessage(0)私の質問は、アプリケーションを実際に終了するためにいつ呼び出すかをどのように知ることができますか?

4

4 に答える 4

5

なんらかの理由で、アプリケーションが開いたウィンドウの数を本当に数えられない場合でも、引き続き使用でき、EnumThreadWindows()ウィンドウがそれ以上ない場合はPostQuitMessage(). 複数のスレッドがある場合は、それらも列挙してください。

MSDNから

BOOL WINAPI EnumThreadWindows(
  __in  DWORD dwThreadId,
  __in  WNDENUMPROC lpfn,
  __in  LPARAM lParam
);
于 2011-08-16T20:18:35.883 に答える
4

開いているウィンドウの数を含む静的変数を保持するだけです。ウィンドウが開くと、カウンターがインクリメントされます。WM_DESTROY ハンドラーでデクリメントします。カウントがゼロになったら、PostQuitMessage を呼び出します。

于 2011-08-16T20:17:30.837 に答える
1

もちろん、唯一のきれいな方法は、ウィンドウを追跡し、何も残っていない場合は終了メッセージを投稿することです。

考えられる回避策は、ウィンドウ列挙関数の 1 つを使用することです。すべてのトップレベル ウィンドウをカウントできるコールバックを呼び出す EnumWindows() を使用して、ウィンドウをカウントできます。ゼロになった場合は、PostQuitMessage() を呼び出します。

于 2011-08-16T20:19:06.203 に答える