C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2009/05/06 02:19
セットアッププロジェクトのカスタム動作でメッセージボックスを普通に使おうとしても、インストーラのウィンドウとの親子関係を持たせることができません。そのため、インストーラのウィンドウの方が前面に表示されてしまったりする場合があります。

インストーラのウィンドウのハンドルさえ取得できれば、NativeWindow クラスを使って親子関係を持たせることもできるのですが、生憎取得できないようです。Process.MainWindowHandle で取得できるかとも思いましたが 0 が返ってきました。

そこで、ちょっと知恵を絞り出してみました。

internal static class MyMessageBox
{
    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
    {
        using (Form dummy = MyMessageBox.ShowDummyForm(caption))
        {
            return MessageBox.Show(dummy, text, caption, buttons, icon, defaultButton);
        }
    }

    private static Form ShowDummyForm(string caption)
    {
        Form dummy = new Form();
        dummy.TopMost = true;
        dummy.ShowInTaskbar = true;
        dummy.Opacity = 0;
        dummy.ControlBox = false;
        dummy.Text = caption;
        dummy.Show();
        return dummy;
    }
}

最前面に固定された透明のダミーウィンドウを表示し、それをメッセージボックスの親ウィンドウにしたわけです。
この方法だとメッセージボックスがタスクバーに表示されませんが、ControlBox プロパティと Text プロパティを変更することで、ダミーウィンドウがちょうど良い具合に代わりを果してくれます。

メッセージボックスが最前面に固定されてしまうという副作用はありますが、まぁ問題ないでしょう。
あと、インストーラのウィンドウとダミーウィンドウ及びメッセージボックスはあくまで無関係ですので、メッセージボックス表示中もインストールウィンドウの操作が従来通りできてしまうことには注意してください。











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/259-01296c17