Question

Si je montre un MessageBox comme modale d'une fenêtre sur un autre processus, il fonctionne très bien aussi longtemps que mon programme reste de répondre. Si elle est fermée ou terminée alors que le MessageBox montre les fenêtres qui ont reçu le MessageBox sera verrouillé (mais toujours répondre) et il devra être finalisé par le Gestionnaire des tâches.

Voici un exemple de code pour démontrer que:

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

}

Comment éviter cela?

Était-ce utile?

La solution

Le fait de montrer une boîte de dialogue modale désactive la fenêtre parent de la boîte de dialogue (fenêtre de Bloc-notes dans votre exemple). Lorsque la boîte de dialogue modale est fermée, la fenêtre parent se réactivés.

Si votre programme décède avant elle va réactiver la fenêtre, cette fenêtre ne sera jamais réactivées - il est au fil qui est montrant la boîte de dialogue pour réactiver le parent. (Dans votre exemple, il se produit dans MessageBox.Show(), après que l'utilisateur clique sur OK ou autre.)

La seule façon de faire ce travail serait d'avoir un deuxième processus dont la responsabilité était de remettre les choses comme elles devraient être si le processus de création de la boîte de dialogue modale meurt prématurément, mais c'est horrible. Et il est toujours pas infaillible - si le processus watcher meurt trop

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top