1

MessageBox を別のプロセスのウィンドウのモーダルとして表示すると、プログラムが応答している限り問題なく動作します。MessageBox を受信したウィンドウが表示されている間に MessageBox を閉じたり終了したりすると、MessageBox を受信したウィンドウはロックされ (ただし応答はします)、タスク マネージャーを使用してファイナライズする必要があります。

これを示すサンプル コードを次に示します。

using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace TestMessageBox
{
    class Program
    {
        private WindowWrapper notepad;

        Program(IntPtr handle)
        { 
            notepad = new WindowWrapper(handle); 
        }

        static void Main(string[] args)
        {
            Process[] procs = Process.GetProcessesByName("notepad");
            if (procs.Length > 0)
            {
                Console.WriteLine("Notepad detected...");
                Program program = new Program(procs[0].MainWindowHandle);
                Thread thread = new Thread(new ThreadStart(program.ShowMessage));
                thread.IsBackground = true;
                thread.Start();
                Console.Write("Press any key to end the program and lock notepad...");
                Console.ReadKey();
            }
        }

        void ShowMessage()
        { 
            MessageBox.Show(notepad, "If this is open when the program ends\nit will lock up notepad..."); 
        }
    }

    /// <summary>
    /// Wrapper class so that we can return an IWin32Window given a hwnd
    /// </summary>
    public class WindowWrapper : System.Windows.Forms.IWin32Window
    {
        public WindowWrapper(IntPtr handle)
        { 
            _hwnd = handle; 
        }
        public IntPtr Handle
        { 
            get { return _hwnd; } 
        }
        private IntPtr _hwnd;
    }

}

それを避ける方法は?

4

1 に答える 1

1

モーダル ダイアログを表示すると、ダイアログの親ウィンドウ (この例ではメモ帳のウィンドウ) が無効になります。モーダル ダイアログを閉じると、親ウィンドウが再度有効になります。

ウィンドウを再度有効にする前にプログラムが停止した場合、そのウィンドウは再び有効になりません。ダイアログを表示しているスレッドが親を再度有効にします。MessageBox.Show()(あなたの例では、ユーザーが [OK] などをクリックした後、内で発生します。)

これを機能させる唯一の方法は、モーダル ダイアログを作成するプロセスが時期尚早に終了した場合に、本来あるべき状態に戻すことを担当する 2 番目のプロセスを用意することですが、それは恐ろしいことです。そして、それはまだ防弾ではありません - ウォッチャープロセスも死ぬとどうなりますか?

于 2009-08-11T12:25:16.570 に答える