Delphi で TopMost システム モーダル メッセージ ボックスを表示する方法

非アクティブな Delphi アプリケーションから

オフィスの IT 専門家のグループ

ギラクシア/ゲッティイメージズ





デスクトップ (Windows) アプリケーションでは、 メッセージ (ダイアログ) ボックス アプリケーションのユーザーに何らかのアクションを実行する必要があること、何らかの操作が完了したことを警告するため、または一般的にユーザーの注意を引くために使用されます。

デルファイ 、ユーザーにメッセージを表示するにはいくつかの方法があります。 ShowMessage や InputBox など、RTL で提供されている既製のメッセージ表示ルーチンを使用できます。または、独自のダイアログ ボックスを作成することもできます (再利用するため): CreateMessageDialog。



上記のすべてのダイアログ ボックスに共通の問題は、 ユーザーに表示するには、アプリケーションをアクティブにする必要があります . 「アクティブ」とは、アプリケーションが「入力フォーカス」を持っていることを指します。

本当にユーザーの注意を引き、他の操作を止めたい場合は、次のことができる必要があります。 アプリケーションがアクティブでない場合でも、システム モーダルのメッセージ ボックスを最上位に表示する .



システム モーダルの一番上のメッセージ ボックス

これは複雑に聞こえるかもしれませんが、実際にはそうではありません。

Delphi はほとんどの Windows API 呼び出しに簡単にアクセスできるため、'MessageBox' Windows API 関数を実行するとうまくいきます。

「windows.pas」ユニットで定義されています。これは、すべての Delphi フォームの uses 句にデフォルトで含まれています。 メッセージボックス 関数は、メッセージ ボックスを作成、表示、および操作します。メッセージ ボックスには、アプリケーション定義のメッセージとタイトル、および定義済みのアイコンとプッシュ ボタンの任意の組み合わせが含まれます。

MessageBox の宣言方法は次のとおりです。



|_+_||_+_|
hWnd: HWND;
lpText、
lpCaption : PAnsiChar;
uType : カーディナル) : 整数;

最初のパラメーター、 ハウンド 、作成するメッセージ ボックスのオーナー ウィンドウのハンドルです。ダイアログ ボックスが表示されているときにメッセージ ボックスを作成する場合は、ダイアログ ボックスのハンドルを 巻き戻し パラメータ。

lpTextlpキャプション メッセージ ボックスに表示されるキャプションとメッセージ テキストを指定します。



最後は uType パラメータであり、最も興味深いものです。このパラメーターは、ダイアログ ボックスの内容と動作を指定します。このパラメーターは、さまざまなフラグの組み合わせにすることができます。

例: システムの日付/時刻が変更された場合のシステム モーダル警告ボックス

システム モーダルの最上位メッセージ ボックスを作成する例を見てみましょう。あなたは Windows メッセージを処理する これは、実行中のすべてのアプリケーションにディスパッチされます。 システムの日付/時刻の変更 —たとえば、[日付と時刻のプロパティ] コントロール パネル アプレットを使用します。



MessageBox 関数は次のように呼び出されます。

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|

最も重要な部分は、最後のパラメーターです。 'MB_SYSTEMMODAL または MB_SETFOREGROUND または MB_TOPMOST' は、メッセージ ボックスがシステム モーダルであり、一番上にあり、フォアグラウンド ウィンドウになることを保証します。



    MB_SYSTEMMODALフラグは、hWnd パラメーターで識別されるウィンドウで作業を続行する前に、ユーザーがメッセージ ボックスに応答する必要があることを保証します。MB_TOPMOSTflag は、ウィンドウが非アクティブ化されている場合でも、メッセージ ボックスを最上位以外のすべてのウィンドウの上に配置し、その上にとどめておく必要があることを指定します。MB_SETFOREGROUNDフラグは、メッセージ ボックスがフォアグラウンド ウィンドウになることを保証します。

完全なコード例を次に示します (ユニット「unit1」で定義された「Form1」という名前の TForm)。

|_+_||_+_|

|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

|_+_|

この単純なアプリケーションを実行してみてください。アプリケーションが最小化されていること、または少なくとも他のアプリケーションがアクティブであることを確認してください。 [日付と時刻のプロパティ] コントロール パネル アプレットを実行し、システム時刻を変更します。 [OK] ボタンを押すとすぐに ( アプレット ) 非アクティブなアプリケーションからのシステム モーダルの一番上のメッセージ ボックスが表示されます。