Pergunta

Se eu mostrar um MessageBox como modal de uma janela em outro processo, ele funciona muito bem, desde que o meu programa restos responder. Se estiver fechado ou encerrado enquanto o MessageBox está mostrando as janelas que receberam o MessageBox será bloqueado (mas ainda de responder) e terá de ser finalizado via Gerenciador de tarefas.

Aqui está um código de exemplo para demonstrar 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;
    }

}

Como evitar isso?

Foi útil?

Solução

O ato de apresentação de uma janela modal desactiva a janela pai da caixa de diálogo (janela do bloco de notas no seu exemplo). Quando o diálogo modal está fechada, a janela pai fica habilitado-re.

Se o seu dies programa antes de re-permite a janela, essa janela nunca vai ter reativado - é até o fio que está mostrando o diálogo para re-habilitar o pai. (No seu exemplo, isso acontece dentro MessageBox.Show(), após o usuário clicar em OK ou o que quer.)

A única maneira de fazer este trabalho seria ter um segundo processo cuja responsabilidade era para colocar as coisas de volta como deveriam ser, se o processo de criação de matrizes de diálogo modais prematuramente, mas isso é horrível. E ainda não é à prova de balas - o que se o processo de observador morre também

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top