【问题标题】:How to start a process and set its main window as a child window of my app如何启动一个进程并将其主窗口设置为我的应用程序的子窗口
【发布时间】:2016-07-04 18:19:18
【问题描述】:

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

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

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

除了使用定时器,还有什么好方法可以等待句柄被创建?

【问题讨论】:

    标签: c# setparent managementeventwatcher


    【解决方案1】:

    根据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.
    

    【讨论】:

    • 它对我不起作用。它只是在创建 mainWindowHandle 之前通过等待。使用while (myProcess.MainindowHandle == IntPtr.Zero) { } 会导致无限循环。
    • @e.s : 嗯...我会围绕这个主题做一些测试,看看我想出了什么。
    • @e.s :我现在已经对Process.WaitForInputIdle()while-loop 进行了测试,并且都运行良好!即使不使用线程。如果它对您不起作用,那么可能正在启动的进程没有主窗口?
    • @e.s :另请参阅此答案:stackoverflow.com/a/16185802/3740093 - 也许您需要在循环中不时致电Process.Refresh()
    • 循环内的 Process.Refresh() 对我有用。但我害怕进入无限循环。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2013-02-28
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多