none
Process beim Formular_load starten und bei Formular_FormClosing beenden

    Frage

  • 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


    Samstag, 13. Januar 2018 09:19

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
    Samstag, 13. Januar 2018 21:27

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")





    Samstag, 13. Januar 2018 20:50
  • 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
    Samstag, 13. Januar 2018 21:27
  • 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

    Sonntag, 14. Januar 2018 09:51
  • 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ß

    Sonntag, 14. Januar 2018 15:18