ShowDialog()不会阻止原始表单的可点击性

本文关键字:表单 原始 ShowDialog | 更新日期: 2023-09-27 18:00:14

我有一个winform,它包含以下代码,在打开表单时打开一个外部程序。如果程序关闭,则会弹出一个对话框,其中包含一个选项以返回单击了某个按钮。这将关闭对话框并返回到初始形式,然后运行函数再次打开外部程序。

问题是,原始表单仍然可以点击,而且该功能没有运行。有什么想法吗?

    public Manager()
    {
        InitializeComponent();
        ExternalProgramOpen();
    }
    private void ExternalProgramOpen()
    {
        Process startProgram = Process.Start("program.exe", Program.ConnectionArg);
        startProgram.EnableRaisingEvents = true;
        startProgram.Exited += this.PrematureClose;
    }
    private void PrematureClose(object sender, EventArgs e)
    {
        ManagerWarning messagepopup = new ManagerWarning();
        messagepopup.ShowDialog();
        using (var ManagerWarning = new ManagerWarning())
        {
            if (ManagerWarning.ShowDialog() == DialogResult.Retry)
            {
                ExternalProgramOpen();
            }
        }
     }

ShowDialog()不会阻止原始表单的可点击性

产生这种影响的原因可能是Exited事件不是在启动进程的同一UI线程中引发的。

当您从另一个线程调用ShowDialog()时,新窗口将不会使用和阻止原始UI线程。

要解决此问题,请检查InvokeRequired是否为true,并使用Invoke:

private void PrematureClose(object sender, EventArgs e)
{
    if (InvokeRequired)
    {
        Invoke(new Action(() => PrematureClose(sender, e)));
        return;
    }
    // your code here
    // ...
}