如何启动一个进程,并将其主窗口设置为我的应用程序的子窗口

本文关键字:窗口 设置 应用程序 我的 启动 何启动 进程 一个 | 更新日期: 2023-09-27 17:54:32

我正在从我的c#应用程序开始一个新的进程。

创建进程后,我使用 managenteventwatcher SetParent将其主窗口设置为应用程序窗口的子窗口。

问题是,当我写在我的查询WITHIN 2一切都很好,除了我等待很长时间。当我写WITHIN 1时,当事件EventArrived触发时,已启动进程的mainwindowhhandle尚未创建。

是否有任何好的方法来等待句柄被创建,除了使用定时器?

如何启动一个进程,并将其主窗口设置为我的应用程序的子窗口

根据 Process.MainWindowHandle 的MSDN文档,您可以使用 Process.WaitForInputIdle() 方法来"允许进程完成启动,确保主窗口句柄已经创建。"

根据进程完成启动所需的时间,您可能需要在线程中等待它,否则您的UI可能会冻结。

不管怎样,只要继续等待:

yourProcess.WaitForInputIdle();
//Do your stuff with the MainWindowHandle.

另一种选择是在线程和循环中运行代码,直到MainWindowHandle不为零。为了避免进入无限循环,你可以添加一些超时。

int timeout = 10000; //10 seconds.
while (yourProcess.MainWindowHandle == IntPtr.Zero && timeout > 0)
{
    yourProcess.Refresh();
    System.Threading.Thread.Sleep(250); //Wait 0.25 seconds.
    timeout -= 250;
}
if (yourProcess.MainWindowHandle == IntPtr.Zero)
{
    //Timed out, process still has no window.
    return; //Do not continue execution.
}
//The rest of your code here.