49

私は最近、デフォルトで MessageBoxes がデフォルトで表示されたときに一番上のフォームではないことを知りました。メッセージボックスを他のウィンドウの上に表示したくない状況を誰かが知っているかどうか疑問に思っていましたか?

アプリケーションのロード中にスプラッシュ画面を表示し始めたときに問題が見つかりました。プログラムはまだ実行されているように見えましたがMessageBox、入力を待っているスプラッシュ画面の背後にありました.スプラッシュ画面は別のスレッドで表示されましたメッセージボックスを呼び出したスレッドなので、これがスプラッシュの上に表示されなかった理由だと思います。MB_TOPMOSTしかし、これは MessageBoxにデフォルトでフラグがない理由をまだ説明していませんか?

編集

より明確にするために:最終的に、メッセージボックスを作成するために、これと同様のことをしなければなりませんでした。コードは、メモリから書かれたものとまったく同じではありません)

[DllImport("User32.dll")]
private int extern MessageBox(windowhandle, message, caption, flag);
public static void MessageBox(windowhandle, string message, string caption)
{
    MessageBox(windowhandle, message,caption, MB_TOPMOST);
}
4

5 に答える 5

35

アプリケーションの一番上に MessageBox を表示するには

コード

//Should be MessageBox.Show() below
MessageBox.Show(this, "My top most message");

MB_TOPMOSTデフォルトではない理由

MB_TOPMOST がデフォルトの場合、MessageBoxは「システム モーダル」モードで表示され、そのフォームの一番上に表示されます。副作用として、「システム モーダル」モードにより、メッセージが閉じられるまでウィンドウMessageBoxブロックされます。通常は「アプリケーション モーダル」モードになります。

参考リンク

  1. MSDN フォーラム - MessageBox を最上位ウィンドウとして表示する方法
  2. SO - アプリがトレイに最小化されたときに C# MessageBox を前面に表示する
于 2013-04-19T13:20:37.613 に答える
6

表示MessageBoxするときは、その所有者を最初の引数として指定します。たとえば、Formインスタンス呼び出しから呼び出す場合:

MessageBox.Show(this, "Message");

それを所有するウィンドウへの参照を最初の引数として提供します。

メッセージ ボックス (および一般的なモーダル フォーム) は、アプリケーションのすべてのウィンドウの上に表示されるわけではありません。それらは所有者の上にのみ表示されます。メッセージ ボックス (または他のモーダル フォーム) をスプラッシュ スクリーンの上に表示する場合は、その所有者をスプラッシュ フォーム インスタンスに設定します。

于 2013-04-19T13:05:38.283 に答える