1

非表示モードで process.start を使用して、単純な .net exe/notepad.exe を開こうとしています。そして、しばらくしてから application.exe を表示できるようにするために、後でプロセスハンドルが必要です。

  1. WindowStyle.Minimized、WindowStyle.Maximized、WindowStyle.Normal でのみハンドルを取得できます。Hidden スタイルでは、常に 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 に答える