デルファイアプリケーションに現在モーダルウィンドウがあるかどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/284581

  •  08-07-2019
  •  | 
  •  

質問

Delphi MDIアプリケーションでタイマーを実行しています。バックグラウンドで何かが変更された場合、それを使用してメッセージをポップアップしたいと思います。しかし、ユーザーが何もできないので、アプリケーションのフォアグラウンドにモーダルダイアログがある場合、そのメッセージをポップアップ表示したくありません。

では、アプリケーションにモーダルダイアログが存在するかどうかを確認する方法を知りたいのですが、

役に立ちましたか?

解決

このコードで試すことができます:

var
  ActForm: TCustomForm;
begin
  ActForm := Screen.ActiveForm;
  if (ActForm = nil) or not (fsModal in ActForm.FormState) then begin

  end;
end;

私はDelphi 4でテストしました。私のために動作します。

[編集]:しかし、フォームをポップアップしてフォーカスを盗むのは良い考えかどうかを本当に考えるべきです。アプリケーションによって異なりますが、ユーザーが現在編集フィールドに何かを入力している場合、またはマウスで何かをしている場合、ワークフローが中断される可能性があります。

他のヒント

Delphi 2005以降には、 ModalLevel があります。 TApplicationのプロパティ。アプリケーションで開かれたモーダルフォームの数をカウントします。

おそらく解決策は、フォーカスを奪わないヒントを実際にポップアップすることです。どこかで見えるクリック可能なヒントですが、あまり侵襲的ではありません。したがって、ユーザーがアクションを実行したい場合、または実行していたことを完了できる場合は、アクションを実行します。または、完全に無視することもできます。

AnyPopup ()関数を使用します

GetLastActivePopup ()について。戻り値は、hWndパラメーターと同じ場合です

  • hWndによって識別されたウィンドウは、最近アクティブになりました。
  • hWndで識別されるウィンドウは、ポップアップウィンドウを所有していません。
  • hWndで識別されるウィンドウはトップレベルウィンドウではないか、別のウィンドウが所有しています。

今日のユーザー histrio 別のスレッドは、モーダルDelphiフォームを監視するだけでは不十分です。 Windowsにはモーダルダイアログもあります。

彼の別のスレッドで回答は、それを確認する方法を示しています。

-jeroen

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top