Benutzer mit den meisten Antworten
Process beim Formular_load starten und bei Formular_FormClosing beenden

-
Hallo Leute,
ich habe folgendes Problem.
Ich möchte beim öffnen eines Formulars den Windows-Explorer starten und beim schließen des Formulars den Windows-Explorer wieder beenden.
Dim pExplorer As New System.Diagnostics.Process() Private Sub myfrm_Load(sender As Object, e As EventArgs) Handles MyBase.Load pExplorer.Start("explorer.exe", "D:\MeinPfad") '[...] End Sub Private Sub myfrm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
pExplorer.CloseMainWindow()
If pExplorer.HasExited = False Then If pExplorer.CloseMainWindow() = False Then pExplorer.Kill() End If End If End Sub
Das starten des Explorers funktioniert. :-)
Leider scheitere ich beim schließen des Explorers. Ich laufe immer auf den Fehler:
System.InvalidOperationException: "Diesem Objekt ist kein Prozess zugeordnet."
Was mache ich denn falsch?
Ich hoffe einer kann mir helfen.
Vielen Dank im Voraus.
Gruß A. Martens
- Bearbeitet Ahmed Martens Samstag, 13. Januar 2018 09:19
Frage
Antworten
-
Hallo Ahmed,
mit dem "Explorer" ist es etwas komplizierter, als mit anderen (einfachen) Prozessen (z.B. Notepad).Wenn du den Prozess startest, erscheint er im nächsten Schritt schon wieder beendet zu sein.
Hier mal ein Beispiel, wie es gehen könnte (ich bin davon ausgegangen, dass du das angegebene Verzeichnis im Explorer öffnen willst...):
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim pExplorer = Process.Start("explorer.exe", "/open, D:\TEMP") Dim SchonBeendet = pExplorer.HasExited ' Ist schon True ! End Sub Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing Dim procs = Process.GetProcessesByName("explorer") Try Dim explorer = procs.Where(Function(p) Return p.MainWindowTitle <> "" End Function).First() explorer.CloseMainWindow() explorer.WaitForExit(1000) Catch ex As Exception MsgBox(ex.ToString) End Try End Sub
Es gibt ein mögliches Problem. In dieser Variante wird das zuletzt geöffnete Explorer-Fenster geschlossen. Das muss nicht die Instanz sein, die du in deinem Programm gestartet hast, wenn du danach z.B. noch einen weiteren Explorer manuell gestartet hast... Du kannst auch nach dem Explorer suchen, der im "MainWindowTitle" deinem selektierten Pfad entspricht. Aber dran denken, der Anwender kann einen anderen Pfad ausgesucht haben... :-)
Gruß
- Als Antwort markiert Ahmed Martens Sonntag, 14. Januar 2018 09:51
Alle Antworten
-
Process.Start gibt dein erstellten Explorerprozess zurück. Und du brauchst keine Instanz pExplorer um "Start" aufzurufen. Das geht einfach via "Process.Start("explorer.exe")"
Siehe: https://msdn.microsoft.com/de-de/library/0w4h05yb(v=vs.110).aspx
Du solltest also dieses zurückgegebene Objekt in die Variable (pExplorer) speichern und später auf dieser Variable die Befehle Kill bzw CloseMainWindow anwenden.
pExplorer = Process.Start("explorer.exe", "D:\MeinPfad")
- Bearbeitet Benjamin Schäublin Samstag, 13. Januar 2018 20:54
-
Hallo Ahmed,
mit dem "Explorer" ist es etwas komplizierter, als mit anderen (einfachen) Prozessen (z.B. Notepad).Wenn du den Prozess startest, erscheint er im nächsten Schritt schon wieder beendet zu sein.
Hier mal ein Beispiel, wie es gehen könnte (ich bin davon ausgegangen, dass du das angegebene Verzeichnis im Explorer öffnen willst...):
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim pExplorer = Process.Start("explorer.exe", "/open, D:\TEMP") Dim SchonBeendet = pExplorer.HasExited ' Ist schon True ! End Sub Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing Dim procs = Process.GetProcessesByName("explorer") Try Dim explorer = procs.Where(Function(p) Return p.MainWindowTitle <> "" End Function).First() explorer.CloseMainWindow() explorer.WaitForExit(1000) Catch ex As Exception MsgBox(ex.ToString) End Try End Sub
Es gibt ein mögliches Problem. In dieser Variante wird das zuletzt geöffnete Explorer-Fenster geschlossen. Das muss nicht die Instanz sein, die du in deinem Programm gestartet hast, wenn du danach z.B. noch einen weiteren Explorer manuell gestartet hast... Du kannst auch nach dem Explorer suchen, der im "MainWindowTitle" deinem selektierten Pfad entspricht. Aber dran denken, der Anwender kann einen anderen Pfad ausgesucht haben... :-)
Gruß
- Als Antwort markiert Ahmed Martens Sonntag, 14. Januar 2018 09:51
-
Hallo K. Pater,
Dein Programmcode funktioniert absolut einwandfrei und hat auf Anhieb funktioniert. Da ich der einzige bin der das Programm nutzt, ist es völlig o. k. so. Ich war einfach nur zu faul einen zweiten Mausklick auszuführen. :-)
Aber noch einmal eine dämlich Frage (nur zum Verständnis).
War es nicht so, dass jedes Programm, welches gestartet wird, eine feste TaskID erhält?
Könnte man nicht anhand dieseer TaskID, das Explorerfenster identifizieren?
Gruß Ahmed
-
Hallo Ahmed
War es nicht so, dass jedes Programm, welches gestartet wird, eine feste TaskID erhält?
Ich glaube, normal ist das auch so. Beim Explorer kann es sein, dass ein neuer Prozess mit entsprechender ID erzeugt wird. Es kann aber auch sein, dass nur "Unterfenster" erstellt werden ohne eigene Process-ID.
Gruß