System.Diagnostics.Process.Start with WindowStyle.Hidden не повторяет обработку
Я пытаюсь открыть простой.net exe/notepad.exe, используя process.start в скрытом режиме. позже мне понадобится дескриптор процесса, чтобы application.exe сделал его видимым через некоторое время.
Возможность получить дескриптор только в WindowStyle.Minimized, WindowStyle.Maximized, WindowStyle.Normal. В скрытом стиле это всегда дает мне 0.
Как получить ручку без использования 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. }
1 ответ
Вы можете сделать что-то вроде этого:
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)
Таким образом, вы не тратите больше времени, чем нужно.
Вы не можете получить управление скрытого процесса.
По данным МС: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.
Я думаю, что ваш единственный выбор состоял бы в том, чтобы запустить его как обычно, получить ручку, а затем скрыть ее.
Это может вызвать мерцание, но оно должно работать. Чтобы смягчить мерцание, вы можете запустить его свернутым...