1

MessageDlgを使用していて、タスクバーのclose all / groupコマンドを使用してアプリケーションを閉じようとすると、奇妙な動作に気づきました。

私のアプリケーションは次のとおりです。

  1. 一部のWindowsメッセージを処理し、それらを子ウィンドウに渡す以外に何もしない非表示のメインフォームがあります(必要な場合)。
  2. 各子ウィンドウの親はデスクトップに設定されています(タスクバーに表示するため)。
  3. 各子にはOnCloseイベントがあり、MessageDlgをポップアップして、セッションを保存するかどうかをユーザーに確認します(コンテンツが変更されている場合)。

問題は、変更されていないウィンドウを継続的に閉じることであるようですが、変更されたウィンドウにヒットすると、2つの事柄のうちの1つが断続的に発生します。

  1. 「はい/いいえ」を選択しても、特定のウィンドウを閉じた後、すべて閉じるプロセスが停止するようです。
  2. ダイアログは表示されず、mrCancelが結果になります。このウィンドウが閉じられた後、再びすべてのプロセスを閉じます。

私が行った変更は、MessageDlgの代わりにWinAPI MessageBox関数を使用することでしたが、これで問題が解決したようです。しかし、なぜMessageDlgがこのように動作しているのか知りたいのですが。

私の最初の考えは、ダイアログが閉じる途中で起動されているときでした。おそらく、OSは技術的にグループの一部であるため、ダイアログにWM_CLOSEメッセージを送信しています(これは、ダイアログが表示されず、デフォルトでmrCancelになっていることを説明します。 Xを押すのと同じです)。ただし、ダイアログを閉じた後、[すべて閉じる]プロセスがグループ内の他のウィンドウを閉じ続けない理由は説明されていません。

これについて何か考え/アイデアはありますか?

4

2 に答える 2

3

Windowsはこれらのウィンドウにメッセージを送信せず、リクエストとともにWM_CLOSE投稿WM_SYSCOMMANDSC_CLOSEます。これによりWM_CLOSE、標準のWindowsメッセージボックスが使用されている場合にメッセージが送信されます。代わりにこのMessageDlg()関数を使用すると、最初に投稿されたものだけがにWM_SYSCOMMANDつながりWM_CLOSE、他の投稿はそうではありません。確かに言うのは難しいですが、これはおそらく、VCLがモーダルダイアログを「偽造」するために使用するDisableTaskWindows()および呼び出しと関係があります。EnableTaskWindows()Windows関数をとをApplication.MessageBox()使用するラッパーである。に置き換えるDisableTaskWindows()EnableTaskWindows()、それも機能しません(IMOはこの推論をサポートしています)。

于 2009-12-10T22:08:32.780 に答える
0

MessageDlgなぜからに切り替えてMessageBox物事が変わったのか説明できると思います。次に、Windowsのように見えるDelphiフォームを作成するをMessageDlg呼び出します。このフォームはで示されていると呼ばれます。これにより、アプリケーションが閉じられるまでアプリケーション全体がロックされます。MessageDlgPosHelpMessageBoxShowModal

MessageBox一方、デフォルトMB_APPLMODALでは、接続されているウィンドウを使用する前に閉じる必要があります。uFlagsパラメーターに何も指定されていない場合、これがデフォルトです。hwndこれにより、パラメータで指定されたウィンドウに戻ることができなくなるだけなので、アプリケーションの他のウィンドウに引き続きアクセスできます。

于 2009-12-10T15:42:13.763 に答える