다른 프로세스의 모달 메시지 상자 '핸들 핸들이 대상 프로세스를 잠글 수 있습니다.

StackOverflow https://stackoverflow.com/questions/1259920

문제

메시지 상자를 다른 프로세스에서 창의 모달로 표시하면 내 프로그램이 계속 응답하는 한 잘 작동합니다. MessageBox가 수신 된 Windows를 표시하는 동안 닫히거나 종료되면 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;
    }

}

그것을 피하는 방법?

도움이 되었습니까?

해결책

모달 대화 상자를 표시하는 행위는 대화 상자의 상위 창을 비활성화합니다 (예에서 메모장의 창). 모달 대화 상자가 닫히면 상위 창이 다시 활성화됩니다.

프로그램이 창을 다시 활성화하기 전에 프로그램이 사망하면 해당 창이 다시 활성화되지 않습니다. 부모를 다시 활성화하는 대화 상자가 표시되는 스레드에 달려 있습니다. (예에서는 내부에서 발생합니다 MessageBox.Show(), 사용자가 확인하거나 무엇이든 클릭 한 후.)

이 작업을 수행하는 유일한 방법은 모달 대화를 만드는 프로세스가 조기에 사라지는 경우와 같이 책임을 져야 할 책임이있는 두 번째 프로세스를 갖는 것입니다. 그러나 그것은 끔찍합니다. 그리고 여전히 방탄이 아닙니다. 감시자 프로세스도 죽으면 어떻게 될까요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top