Überprüfen ob ein Programm gestartet wird

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Überprüfen ob ein Programm gestartet wird

    Hallo guten Tag :)

    Ich wollte eine Anwendung schreiben die zählt wie lange die Datei gestartet ist(XXX.exe) und
    wenn sie weider geschlossen wird soll sie aufhören zu zählen ich habe schon gesucht aber nichts gefunden wie man
    das schreibt und das Programm soll im Hintergrud weiterlaufen


    Vielen dank im vorraus :thumbsup:
    Gugst Du GetProcessesByName(), oben rechts im Suchfenster eingeben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Gugst Du GetProcessesByName(), oben rechts im Suchfenster eingeben.
    @Rod Das geht besser mit WMI

    Eine Möglichkeit besteht natürlich darin in einem Timer immer die aktuellen Processe zu scannen.

    Eleganter ist die Möglichkeit einen ManagementWatcher über WMI zu definieren und dessen Ereignisse für Prozessstart/Ende abzufangen:
    "Notepad Watcher"

    VB.NET-Quellcode

    1. Imports System.Management
    2. Public Class Form1
    3. Private myProcessName As String = "notepad.exe"
    4. Private startWatcher As ManagementEventWatcher
    5. Private stopWatcher As ManagementEventWatcher
    6. ' FORM CLOSING EVENT
    7. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    8. ' stop startwatcher
    9. startWatcher.Stop()
    10. startWatcher.Dispose()
    11. ' stop stopwatcher
    12. stopWatcher.Stop()
    13. stopWatcher.Dispose()
    14. End Sub
    15. ' FORM LOAD EVENT
    16. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    17. ' watch current machine
    18. Dim scope As String = "\\.\root\CIMV2" ' watch local machine
    19. Dim interval As Integer = 2 ' interval 2 seconds
    20. Dim query As String
    21. ' Create startwatcher
    22. query = String.Format("SELECT TargetInstance FROM __InstanceCreationEvent WITHIN {0} WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = '{1}'", interval, myProcessName)
    23. startWatcher = New ManagementEventWatcher(scope, query)
    24. AddHandler startWatcher.EventArrived, AddressOf ProcessStarted
    25. startWatcher.Start()
    26. ' Create stopwatcher
    27. query = String.Format("SELECT TargetInstance FROM __InstanceDeletionEvent WITHIN {0} WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = '{1}'", interval, myProcessName)
    28. stopWatcher = New ManagementEventWatcher(scope, query)
    29. AddHandler stopWatcher.EventArrived, AddressOf ProcessStopped
    30. stopWatcher.Start()
    31. End Sub
    32. ' process stopped event
    33. Private Sub ProcessStopped(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
    34. Dim targetInstance As ManagementBaseObject = DirectCast(e.NewEvent.Properties("TargetInstance").Value, ManagementBaseObject)
    35. Dim processName As String = targetInstance.Properties("Name").Value.ToString()
    36. ' do something
    37. MessageBox.Show(String.Format("{0} process ended", processName))
    38. End Sub
    39. ' process started event
    40. Private Sub ProcessStarted(ByVal sender As Object, ByVal e As EventArrivedEventArgs)
    41. Dim targetInstance As ManagementBaseObject = DirectCast(e.NewEvent.Properties("TargetInstance").Value, ManagementBaseObject)
    42. Dim processName As String = targetInstance.Properties("Name").Value.ToString()
    43. MessageBox.Show(String.Format("{0} process started", processName))
    44. End Sub
    45. End Class


    Um zu funktionieren muss vorher ein Verweis auf System.Management ins Projekt eingebunden sein.

    Kangaroo schrieb:

    Das geht besser mit WMI
    Wie auch immer.
    Ich sehe jeden Tag mindestens 2 neue Threads mit äquivalentem Inhalt, leider sind die Probanden nicht in der Lage, die Suchfunktion zu betätigen. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Ich sehe jeden Tag mindestens 2 neue Threads mit äquivalentem Inhalt, leider sind die Probanden nicht in der Lage, die Suchfunktion zu betätigen.

    Du bist ja auch erheblich aktiver als ich ;)

    ... und wenn Suchfunktion und das Studium der MSDN Dokumentation Pflicht wären, so wäre das Forum tot und wir müssten in den Arbeitspausen wieder Sudoku spielen ;)