Pregunta

Si muestro un cuadro de mensaje como modal de una ventana en otro proceso, funciona muy bien, siempre y cuando mi programa sigue respondiendo. Si está cerrado o terminado mientras que el cuadro de mensaje está mostrando las ventanas que recibió el cuadro de mensaje será bloqueado (pero aún responder) y tendrá que ser finalizado a través del Administrador de tareas.

Aquí hay un código de ejemplo para demostrar 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;
    }

}

¿Cómo evitar que?

¿Fue útil?

Solución

El acto de mostrar un diálogo modal deshabilita la ventana padre del diálogo (la ventana del Bloc de notas en su ejemplo). Cuando el diálogo modal está cerrada, la ventana padre se vuelve a habilitar.

Si su programa muere antes de que se vuelve a habilitar la ventana, esa ventana no se volverán a habilitar - le toca a la rosca que se muestra el diálogo para volver a habilitar el padre. (En el ejemplo, esto ocurre dentro de MessageBox.Show(), después de que el usuario hace clic en OK o lo que sea.)

La única manera de hacer este trabajo sería tener un segundo proceso cuya responsabilidad era de poner las cosas como debe ser si el proceso de crear el diálogo modal muere antes de tiempo, pero eso es horrible. Y todavía no es a prueba de balas -? ¿Y si el proceso de observador también muere

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top