Process.Start () und der Prozessbaum

8

Wie kann ich Process.Start () verwenden, aber der gestartete Prozess befindet sich nicht im selben Prozessbaum wie der Startprozess?

Betrachten Sie diese Beispiel-Konsolenanwendung:

%Vor%

Wenn dieses Programm normal beendet wird, wird Internet Explorer weiterhin ausgeführt. Wenn Sie jedoch während der 15-sekündigen Ruhezeit zum Task-Manager wechseln und dieses Programm auswählen und "Prozess-Baum beenden" wählen, wird Internet Explorer ebenfalls geschlossen.

(Dies steht in direktem Zusammenhang mit meine Frage von früher heute , die noch keine Antworten hat.In Windows XP, wenn der Bildschirmschoner-Prozess endet, scheint es, den Prozessbaum zu beenden, während in Vista nur der Bildschirmschoner-Prozess beendet wird.

>     
user127665 23.06.2009, 21:03
quelle

5 Antworten

15

Eric hat Recht: Windows stellt keine Methode zum Ändern eines übergeordneten Prozesses bereit. Wenn der Elternteil jedoch stirbt, gibt es keine Verbindung zurück zum Großvater, so dass Sie Ihr Ziel mit einem Zwischenprozess erreichen können, der das Kind startet und dann stirbt.

Also: Proc A startet Proc B, dann Proc B startet Proc C und stirbt sofort. Wenn Proc B stirbt, wird Proc C ein Wurzelknoten im Prozessbaum sein - proc C wird NICHT in Procs A Baum sein, nachdem Proc B stirbt.

    
noctonura 23.06.2009, 23:07
quelle
2

Ich glaube nicht, dass Windows (via .NET oder anders) irgendeine Methode zum Ändern des Elternprozesses eines Prozesses offen legt.

Alternativ können Sie beim Systemstart einen separaten Prozess ausführen (z. B. über den Registrierungsschlüssel "SOFTWARE / Microsoft / Windows / CurrentVersion / Run") und die auslösende Anwendung (Ihren Bildschirmschoner) interprozessuell verwenden lassen Kommunikation (SendMessage o.ä.), um den separaten Prozess zum Starten des Browsers anzuweisen. Dann wäre der separate Prozess der Elternteil und der Browser würde nicht getötet, wenn der Prozessbaum des Bildschirmschoners gelöscht wird.

Hier ist ein Beispielcode. Beachten Sie, dass dies keine Fehlerüberprüfung durchführt, und ich habe es nicht im Kontext eines tatsächlichen Bildschirmschoners getestet, aber es sollte Ihnen eine Vorstellung davon geben, worum es geht:

In der Bildschirmschoner-Klasse:

%Vor%

Im Initialisierungscode des Bildschirmschoners:

%Vor%

Im Startbildschirm des Browsers des Bildschirmschoners:

%Vor%

In der Formularklasse des separaten Prozesses:

%Vor%

Im Form_Load-Code des separaten Prozesses:

%Vor%

Und überschreiben Sie das WndProc des separaten Formulars des Formulars:

%Vor%

(Sie möchten natürlich das Formular des separaten Prozesses ausblenden.)

    
Eric Rosenberger 23.06.2009 22:00
quelle
1

Versuchen Sie, Process.StartInfo.UseShellExecute vor dem Aufruf von Process.Start () auf False (standardmäßig True) zu setzen. Auf diese Weise wird CreateProcess () intern anstelle von ShellExecute () verwendet.

    
Remy Lebeau 23.06.2009 22:53
quelle
0

Soweit ich weiß, unterstützt Process.Start () nicht, wonach Sie fragen. Sie müssten PInvoke verwenden, um die Win32 API CreateProcess () - Funktion direkt aufzurufen, sodass Sie das DETACHED_PROCESS-Flag in seinem DwCreationFlags-Parameter angeben können.

    
Remy Lebeau 23.06.2009 21:50
quelle
0

Sie müssen den Kindprozess trennen. Ich bin mir nicht sicher, wie ich in c # vorgehen soll, aber beachte den folgenden Code in C ++, mit dem du / P: aufrufen kannst, um dasselbe in .net zu implementieren.

%Vor%     
Gomes 15.10.2011 15:06
quelle

Tags und Links