Quando inizio un nuovo processo, che differenza fa se uso il.NET - WindowStyle = hidden vs. CreateNoWindow = true?
WindowStyle = hidden
o la proprietà
CreateNoWindow = true
della classe ProcessStartInfo
?
Quando inizio un nuovo processo, che differenza fa se uso il.NET - WindowStyle = hidden vs. CreateNoWindow = true?
WindowStyle = hidden
o la proprietà
CreateNoWindow = true
della classe ProcessStartInfo
?
Come ha detto Hans, WindowStyle è una raccomandazione passata al processo, l'applicazione può scegliere di ignorarla.
CreateNoWindow controlla il funzionamento della console per il processo figlio, ma non funziona da solo.
CreateNoWindow funziona in congiunzione con UseShellExecute come segue:
Per eseguire il processo senza qualsiasi finestra:
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.CreateNoWindow = true;
info.UseShellExecute = false;
Process processChild = Process.Start(info);
Per eseguire il processo figlio in esso la propria finestra (nuova console)
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = true; // which is the default value.
Process processChild = Process.Start(info); // separate window
Per eseguire il processo figlio nella finestra della console del genitore
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = false; // causes consoles to share window
Process processChild = Process.Start(info);
CreateNoWindow si applica solo alle app in modalità console, non crea la finestra della console.
WindowStyle si applica solo alle app native della GUI di Windows. È un suggerimento passato allo WinMain() entry point di tale programma. Quarto argomento, nCmdShow, che spiega come mostrare la sua finestra principale. Questo è lo stesso suggerimento che appare come impostazione "Esegui" in un collegamento sul desktop. Si noti che "nascosto" non è un'opzione, alcuni programmi Windows progettati correttamente rispettano tale richiesta. Dal momento che snookers l'utente, non può più attivare il programma e può solo ucciderlo con Task Manager.
Utilizzando Reflector, sembra che WindowStyle
sia utilizzato se è impostato UseShellExecute
, altrimenti utilizza CreateNoWindow
.
Nell'esempio di MSDN, si può vedere come hanno impostato:
// 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();
Nell'altro esempio, il suo proprio sotto perché UseShellExecute
è in default a true
// UseShellExecute defaults to true, so use the WindowStyle
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Sono d'accordo, anche questo è d'accordo con il mio test. Msdn l'ha fatto all'indietro? https://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110).aspx dicono "Per utilizzare ProcessWindowStyle.Hidden, la proprietà ProcessStartInfo.UseShellExecute deve essere false." <- Credo che msdn abbia fatto retromarcia – barlop
Una cosa che vale la pena notare qui è che ho imparato nel modo più duro: se si crea un processo e poi si modifica il suo StartInfo, si otterrà un comportamento diverso rispetto a se si dovesse creare un ProcessStartInfo e quindi utilizzare Process.Start(). In particolare, il primo non sembra rispettare CreateNoWindow. –
@ AriRoth puoi dare un esempio di codice? Devi creare un processo prima di poter modificare il suo StartInfo. Si direbbe sempre process1.StartInfo = qualcosa. Quindi è necessario prima creare il processo, quindi l'istanza di ProcessStartInfo che si assegna a process1.StartInfo è impossibile fare qualcos'altro. – barlop
@AriRoth e anche se si esegue 'Process process = Process.Start (psi);' invece di 'process.Start() 'Non sono convinto che ci siano differenze di comportamento e stai ancora impostando StartInfo prima di creare il processo. – barlop