1

我正在尝试在隐藏模式下使用 process.start 打开简单的 .net exe/notepad.exe。并且我稍后需要进程句柄以使 application.exe 在一段时间后使其可见。

  1. 只能在 WindowStyle.Minimized、WindowStyle.Maximized、WindowStyle.Normal 中获取句柄。在隐藏式中,它总是给我 0。

  2. 如何在不使用 Thread.Sleep 的情况下进行处理。它需要我们等待几秒钟才能处理。某些 exe 需要更多等待时间,具体取决于其性能(大量数据)。

    public static void LaunchExe()
    {
        var proc = new Process
        {
            StartInfo =
            {
                FileName = "Notepad.exe", //or any simple .net exe
                WindowStyle = ProcessWindowStyle.Hidden
            }
        };
    
        proc.Start();
    
        proc.WaitForInputIdle(800); //is it possible to avoid this.
        Thread.Sleep(3000); //is it possible to avoid this.
    
        Console.WriteLine("handle {0}", proc.MainWindowHandle);
    
    
        //ShowWindowAsync(proc.MainWindowHandle, 1); //planned to use, to make it visible.
    }
    
4

1 回答 1

0

你可以这样做:

        IntPtr ptr = IntPtr.Zero;
        while ((ptr = proc.MainWindowHandle) == IntPtr.Zero)
        { proc.WaitForInputIdle(1 * 60000); Thread.Sleep(10); }   // (1*60000 = 1min, will give up after 1min)

这样一来,您就不会浪费多余的时间。

您无法获得隐藏进程的句柄。

根据 MS: A process has a main window associated with it only if the process has a graphical interface. If the associated process does not have a main window, the MainWindowHandle value is zero. The value is also zero for processes that have been hidden, that is, processes that are not visible in the taskbar.

我认为您唯一的选择是正常启动它,获取句柄,然后将其设置为隐藏。
这可能会导致一些闪烁,但它应该可以工作。为了减轻闪烁,您可以将其最小化...

于 2014-09-02T18:01:36.827 回答