3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)メッセージボックスを最前面に表示したい

現在 BackgroundWorker コンポーネントを使ったマルチスレッドアプリケーションを使ってます。

メインスレッドはフォームのUIを表示し、別スレッドで動くBackgroundWorker.DoWorkイベントハンドラで時間のかかる処理をしています。

この別スレッド側でメッセージボックスを表示したときに、メインスレッドのフォームUIより手前に表示したい かつ 最前面に表示というのが今回の要件です。

(ちなみに、フォームの TopMost プロパティが true でも最前面に表示になるので、メッセージボックスをお手製で作って TopMost プロパティを使うという方法もとれるかもしれません。)

MessageBox クラスには IWin32Window を指定することで、指定したオブジェクより前面に表示する Show メソッドがありますが、今回は最前面に表示したいので、その方法は使いませんでした。

で、調べると、MessageBoxOptions 列挙体MessageBox.Show メソッドに指定することによって最前面に表示ができるようです。

MessageBoxOptions 列挙体で、DefaultDesktopOnly か ServiceNotification を指定したら最前面に表示されました。他のウィンドウに隠れることはありません。

ただし、visual スタイルを使用できないで、古臭いUIにはなります。

DefaultDesktopOnly と ServiceNotification の違いですが、DefaultDesktopOnlyでは既定のデスクトップ(ユーザーがログオンした後でアプリケーションが動作するデスクトップ)でのみ表示され、ServiceNotificationはログインしているユーザーがいない場合でもメッセージボックスが表示されます。

ServiceNotificationは主に、サービスからのメッセージボックス表示に使われるようです。

ユーザログインしてから使うアプリケーションから表示するものだったので、DefaultDesktopOnly を指定しました。

テストソースは下記のような感じです。(C#)

MessageBox.Show("test",

"caption",

MessageBoxButtons.OKCancel,

MessageBoxIcon.Information,

MessageBoxDefaultButton.Button1,

MessageBoxOptions.DefaultDesktopOnly);

参考:

メッセージボックスを表示する: .NET Tips: C#, VB.NET, Visual Studio

Program.csでメッセージボックスを最前面に出す方法

[C#]同じこと考える人いるんですね - Program.csでメッセージボックスを最前面に出す方法