Delphi MDIアプリケーションでタイマーを実行していますが、バックグラウンドで何かが変更された場合に、タイマーを使用してメッセージをポップアップ表示したいと思います。ただし、アプリケーションのフォアグラウンドにモーダルダイアログがある場合、ユーザーはそれについて何もできなかったため、そのメッセージがポップアップ表示されないようにします。
では、私が知りたいのは、アプリケーションにモーダルダイアログが存在するかどうかをどのように確認できるかということです。
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 以降、 TApplication にModalLevelプロパティがあります。アプリケーションで開かれたモーダル フォームの数をカウントします。
AnyPopup () 関数を使用する
GetLastActivePopup ()について。戻り値は、hWnd パラメータと同じ場合があります。
おそらく解決策は、フォーカスを奪わないヒントを実際にポップアップすることです。目に見える場所にクリック可能なヒントがありますが、あまり侵略的ではありません。したがって、ユーザーがアクションを実行したい場合、または実行していたことを終了することができる場合は、アクションを実行します。または、完全に無視することもできます。