Cuando comienzo un nuevo proceso, lo que diferencia hace si uso el.NET - WindowStyle = hidden vs. CreateNoWindow = true?
WindowStyle = hidden
o la propiedad
CreateNoWindow = true
de la clase ProcessStartInfo
?
Cuando comienzo un nuevo proceso, lo que diferencia hace si uso el.NET - WindowStyle = hidden vs. CreateNoWindow = true?
WindowStyle = hidden
o la propiedad
CreateNoWindow = true
de la clase ProcessStartInfo
?
Como dijo Hans, WindowStyle es una recomendación que se pasa al proceso, la aplicación puede elegir ignorarla.
CreateNoWindow controla cómo funciona la consola para el proceso secundario, pero no funciona solo.
CreateNoWindow trabaja en conjunto con UseShellExecute de la siguiente manera:
para ejecutar el proceso sin ningún tipo de ventana:
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.CreateNoWindow = true;
info.UseShellExecute = false;
Process processChild = Process.Start(info);
Para ejecutar el proceso hijo en su propia ventana (nueva consola)
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = true; // which is the default value.
Process processChild = Process.Start(info); // separate window
Para ejecutar el proceso secundario en la ventana de la consola principal
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = false; // causes consoles to share window
Process processChild = Process.Start(info);
CreateNoWindow solo se aplica a las aplicaciones del modo consola, no creará la ventana de la consola.
WindowStyle solo se aplica a las aplicaciones GUI nativas de Windows. Es una pista pasada al WinMain() entry point de dicho programa. Cuarto argumento, nCmdShow, diciéndole cómo mostrar su ventana principal. Esta es la misma sugerencia que aparece como la configuración "Ejecutar" en un acceso directo de escritorio. Tenga en cuenta que "oculto" no es una opción allí, pocos programas de Windows correctamente diseñados respetan esa solicitud. Dado que eso molesta al usuario, ya no puede activar el programa y solo puede matarlo con el Administrador de tareas.
Al usar Reflector, parece que WindowStyle
se usa si UseShellExecute
está configurado, de lo contrario, usa CreateNoWindow
.
En el ejemplo de MSDN, se puede ver la forma en que establecen que:
// Using CreateNoWindow requires UseShellExecute to be false
myProcess.StartInfo.UseShellExecute = false;
// You can start any process, HelloWorld is a do-nothing example.
myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();
En otro ejemplo, el justo por debajo porque UseShellExecute
es por defecto a true
// UseShellExecute defaults to true, so use the WindowStyle
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Estoy de acuerdo, eso también concuerda con mi prueba. ¿Lo ha conseguido msdn al revés? https://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110).aspx dicen "Para usar ProcessWindowStyle.Hidden, la propiedad ProcessStartInfo.UseShellExecute debe ser falsa". <- Creo que msdn lo tengo al revés – barlop
Una cosa que vale la pena señalar aquí es que aprendí de la peor manera: si crea un Proceso y luego modifica su StartInfo, obtendrá un comportamiento diferente que si creara un ProcessStartInfo y luego utilizara Process.Start(). Específicamente, el primero no parece respetar CreateNoWindow. –
@AriRoth ¿Puedes dar un ejemplo de código? Debe crear un proceso para poder modificar su StartInfo. Uno siempre estaría diciendo process1.StartInfo = something. Entonces primero debe crear el proceso y luego la instancia de ProcessStartInfo que asigna a process1.StartInfo es imposible hacer otra cosa. – barlop
@AriRoth e incluso si lo hace 'Process process = Process.Start (psi);' en lugar de 'process.Start() 'no estoy seguro de que exista alguna diferencia de comportamiento y todavía está configurando StartInfo antes de crear el proceso. – barlop