現在 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);
参考: