none
Process überwachen RRS feed

  • Frage

  • Hallo Experten,

    mein Problem ist eine gestarteten Process zu verfolgen. Der folgende Code funzt nicht, da die Events nicht ausgelöst werden, wenn das Programm beendet wird.

    Public Class Form1
        Dim WithEvents pPPrgProcess As New Process
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            pPPrgProcess.EnableRaisingEvents = True
            pPPrgProcess.Start("D:\Entwicklung\Icons\m.png")
        End Sub
    
        Private Sub pPPrgProcess_Disposed(sender As Object, e As EventArgs) Handles pPPrgProcess.Disposed
            Beep()
        End Sub
    
        Private Sub pPPrgProcess_Exited(sender As Object, e As EventArgs) Handles pPPrgProcess.Exited
            Beep()
        End Sub
    End Class

    Wo liegt denn mein Denkfehler ?!?

    Mittwoch, 11. Oktober 2017 11:37

Antworten

  • Hallo Stefan und Roland,

    ich habe mal das Problem wie folgt gelöst, was meint Ihr dazu?

    Imports System.Threading Imports System.Diagnostics Imports System.ComponentModel Public Class Form1 Dim WithEvents p As New Process Private Declare Function FindExecutable Lib "shell32.dll" Alias _ "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load StartPrgProcess("D:\Entwicklung\Icons\m.png") End Sub Private Sub StartPrgProcess(FileToStart As String) Dim exe As String= Space(254) & Chr(0) Dim pfadexe As String = IO.Path.GetDirectoryName(FileToStart) Dim datName As String =IO.Path.GetFileName(FileToStart) Dim result As Long

    result = FindExecutable(datName, pfadexe, exe) p.StartInfo.FileName = exe.Substring(0, InStr(exe, Chr(32)) - 2).Trim p.StartInfo.Arguments = FileToStart p.StartInfo.WindowStyle = ProcessWindowStyle.Maximized p.EnableRaisingEvents = True p.Start() End Sub Private Sub pPPrgProcess_Disposed(sender As Object, e As EventArgs) Handles p.Disposed p.Dispose() End Sub Private Sub pPPrgProcess_ErrorDataReceived(sender As Object, e As DataReceivedEventArgs) Handles p.ErrorDataReceived p.Dispose() End Sub Private Sub pPPrgProcess_Exited(sender As Object, e As EventArgs) Handles p.Exited p.Dispose() End Sub


    Donnerstag, 12. Oktober 2017 07:56

Alle Antworten

  • Ich vermute, das der Denkfehler hier liegt:

    pPPrgProcess.Start("D:\Entwicklung\Icons\m.png")

    "m.png" ist offensichtlich nicht der eigentliche Prozess, sondern lediglich ein Bild, welches mit dem Standardprogramm für PNG's geöffnet wird.

    Gruß, Stefan


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 11. Oktober 2017 11:57
  • Hallo Stefan,

    denke ich auch, aber mir bzw. dem Prg ist vorher nicht klar was er laden soll und mit welchen Programm. Ergo, bleibt mir nichts anderes übrig, als den Process über die Datei zu starten. Nur wie bekomme ich mit, welchen Programm Windows nun gestartet hat für die jeweilige Datei?

    Gruß Monarch

    Mittwoch, 11. Oktober 2017 12:06
  • Hallo Monarch,

    das Problem das Du hast ist dass kein eigener Prozess gestartet wird. Das Bild wird über den Prozess dllHost.exe angezeigt.

    Den Prozess findest Du mit

    Dim prozesse As Process() = Process.GetProcessesByName("dllhost")
    Dim p As Process = prozesse(0)
    

    mit p kannst Du jetzt arbeiten. Allerdings must Du beachten dass mit diesem Prozess auch andere Bilder gehändelt werden.

    Probieren könntest Du mal folgendes:

    Dim prozesse As Process() = Process.GetProcessesByName("dllhost")
    Dim p As Process = prozesse(0)
    AddHandler p.Exited, AddressOf pPPrgProcess_Exited
    Do Until p.HasExited
        Threading.Thread.Sleep(10)
    Loop
    MsgBox("Fertig")
    

    Du könntest Dir z.B. aber auch den Inhalt von

    p.MainWindowTitle

    ansehen und entsprechend auf Änderungen reagieren.

    Grüße

    Roland

    Mittwoch, 11. Oktober 2017 14:45
  • Hallo Stefan und Roland,

    ich habe mal das Problem wie folgt gelöst, was meint Ihr dazu?

    Imports System.Threading Imports System.Diagnostics Imports System.ComponentModel Public Class Form1 Dim WithEvents p As New Process Private Declare Function FindExecutable Lib "shell32.dll" Alias _ "FindExecutableA" (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Long Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load StartPrgProcess("D:\Entwicklung\Icons\m.png") End Sub Private Sub StartPrgProcess(FileToStart As String) Dim exe As String= Space(254) & Chr(0) Dim pfadexe As String = IO.Path.GetDirectoryName(FileToStart) Dim datName As String =IO.Path.GetFileName(FileToStart) Dim result As Long

    result = FindExecutable(datName, pfadexe, exe) p.StartInfo.FileName = exe.Substring(0, InStr(exe, Chr(32)) - 2).Trim p.StartInfo.Arguments = FileToStart p.StartInfo.WindowStyle = ProcessWindowStyle.Maximized p.EnableRaisingEvents = True p.Start() End Sub Private Sub pPPrgProcess_Disposed(sender As Object, e As EventArgs) Handles p.Disposed p.Dispose() End Sub Private Sub pPPrgProcess_ErrorDataReceived(sender As Object, e As DataReceivedEventArgs) Handles p.ErrorDataReceived p.Dispose() End Sub Private Sub pPPrgProcess_Exited(sender As Object, e As EventArgs) Handles p.Exited p.Dispose() End Sub


    Donnerstag, 12. Oktober 2017 07:56
  • Hallo Monarch-Falter,

    du kannst zu jedem Dateityp die Standardanwendung heraus finden, mit der dieser geöffnet wird, sofern eine Zuordnung vorhanden ist. Mit der ermittelten Anwendung kannst Du dann den Prozess starten.

    Die Beschreibung zu File Types aus der MSDN gibt dir Aufschluss über die beteiligten Registry Schlüssel, über die du nachsehen kannst, außerdem kannst Du das IQueryAssociations interface nutzen.


    - Gruß Florian

    Donnerstag, 12. Oktober 2017 11:00
  • Hallo Florian,

    habe ích doch so gemacht oder (siehe Post von Pos 4)

    mfg Monarch

    Donnerstag, 12. Oktober 2017 11:53