检查子进程窗口

时间:2016-08-25 17:11:34

标签: c# .net wpf windows

我有两个.NET应用程序:

  1. parent-app.exe WPF
  2. child-app.exe WinForms
  3. 第一个应用程序启动第二个应用程序

    parent-app.exechild-app.exe

    通过班级System.Diagnostics.Process

    当用户点击parent-app.exe界面上的按钮时,我立即开始child-app.exe 的过程。因为child-app.exe是.NET应用程序,所以在用户看到窗口之前需要一些时间(特别是在慢速系统上)。

    我想向用户显示parent-app.exe的中间(可能是对话框)窗口。此对话框窗口应该说正在处理用户操作,他应该等待child-app.exe的窗口显示。

    问题:

      
        
    • 如何查看parent-app.exe窗口的child-app.exe 可见性状态

    •   
    • 这是一个较长的问题。如何通过考虑限制来实现这个显示中间窗口的系统   两个程序都使用.NET?

    •   

1 个答案:

答案 0 :(得分:1)

根据建议here,您可以尝试调用Process.WaitForInputIdle方法等待创建MainWindowHandle或定期调用Process.Refresh并检查是否MainWindowHandle返回一个有效的句柄。也许这对您来说已经足够了,否则您可以通过句柄获得更多信息。在WinForms中你可能会做这样的事情:

Form window = (Form)Control.FromHandle(process.MainWindowHandle);

我怀疑其他框架有类似的解决方案。

<强>更新

我写了这个小样本,它是未经测试的,我不知道它是否可靠(它可能会死锁),但它应该暗示你可以尝试的一些事情:

namespace SomeNS
{
    using System.Diagnostics;
    using System.Windows.Forms;

    public static class SomeClass
    {
        static void SomeMethod()
        {
            Process process = Process.Start("child-app.exe");
            // YourDialog is your dialog implementation inheriting from System.Windows.Window
            YourDialog dlg = new YourDialog();
            dlg.Loaded += (sender, e) =>
            {
                process.WaitForInputIdle();
                Form window = (Form)Control.FromHandle(process.MainWindowHandle);
                // Do something with the child app's window
                dlg.Close();
            };
            dlg.ShowDialog();
        }
    }
}