Frage

Wenn ich eine MessageBox als modal ein Fenster auf einem anderen Prozess zeigen, es funktioniert gut, solange mein Programm nicht mehr reagiert bleibt. Wenn es geschlossen oder beendet wird, während die MessageBox die Fenster zeigen, dass der MessageBox empfangen wird gesperrt (aber immer noch reagiert), und es wird über die Task-Manager abgeschlossen werden muß.

Hier ist ein Beispielcode zu zeigen, dass:

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;
    }

}

Wie das vermeiden?

War es hilfreich?

Lösung

Der Akt einen modalen Dialog zeigt deaktiviert das übergeordnete Fenster des Dialogs (Notepad Fenster in Ihrem Beispiel). Wenn der modale Dialog geschlossen wird, wird das übergeordnete Fenster wieder aktiviert.

Wenn Ihr Programm stirbt, bevor er das Fenster wieder aktiviert, wird das Fenster nie bekommt fähige wieder - es ist bis zu dem Thread, der den Dialog ist zeigt, auf die übergeordnete wieder zu aktivieren. (In Ihrem Beispiel, geschieht es innerhalb MessageBox.Show(), nachdem der Benutzer auf OK klickt oder was auch immer.)

Die einzige Möglichkeit, diese Arbeit zu machen wäre, einen zweiten Prozess, das hat Verantwortung war es Dinge zurück zu setzen, wie sie, wenn der Prozess den modalen Dialog vorzeitig stirbt zu schaffen sein sollten, aber das ist schrecklich. Und es ist immer noch nicht in beschuss - was ist, wenn der Beobachter Prozess stirbt auch

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top