vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2015
 
zurück
Rubrik: System/Windows · Prozesse/Tasks   |   VB-Versionen: VB4, VB5, VB614.03.02
Prüfen, ob ein Task noch läuft und ggf. beenden

Dieses Beispiel zeigt, wie sich prüfen lässt, ob ein bestimmter Task noch läuft. Dieser lässt sich dann auf Wunsch per Code beenden.

Autor:   Thomas BannertBewertung:     [ Jetzt bewerten ]Views:  43.547 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Summer-Special bei Tools & Components!
Gute Laune Sommer bei Tools & Components
Top Summer-Special - Sparen Sie teilweise über 100,- EUR
Alle sev-Entwicklerkomponenten und Komplettpakete jetzt bis zu 25% reduziert!
zum Beispiel:
  • Developer CD nur 455,- EUR statt 569,- EUR
  • sevDTA 2.0 nur 224,30 EUR statt 299,- EUR
  •  
  • vb@rchiv   Vol.6 nur 18,70 EUR statt 24,95 EUR
  • sevCoolbar 3.0 nur 58,70 EUR statt 69,- EUR
  • - Werbung -Und viele weitere Angebote           Aktionspreise nur für kurze Zeit gültig

    "Läuft ein bestimmter Task noch - und wenn ja, wie kann ich diesen per Code beenden?"

    Diese oder ähnliche Fragen stehen in unseren Diskussionsforen zur Zeit hoch im Kurs. Und deshalb möchten wir Ihnen heute einen Weg zeigen, wie sich prüfen lässt, ob eine bestimmte Anwendung (ein Task) noch ausgeführt wird oder nicht. Allerdings müssen wir hierzu die TaskID kennen. Zusätzlich zeigen wir dann noch, wie sich ein Task automatisch per VB-Code beenden lässt.

    Erstellen Sie ein neues Projekt und fügen nachfolgende API-Deklarationen und Funktionen in ein neues Modul ein:

    Option Explicit
     
    ' hier die benötigten API-Deklarationen
    Private Declare Function CloseHandle Lib "kernel32" ( _
      ByVal hObject As Long) As Long
     
    Private Declare Function OpenProcess Lib "kernel32" ( _
      ByVal dwDesiredAccess As Long, _
      ByVal bInheritHandle As Long, _
      ByVal dwProcessId As Long) As Long
     
    Private Declare Function GetExitCodeProcess Lib "kernel32" ( _
      ByVal hProcess As Long, _
      lpExitCode As Long) As Long
     
    Private Declare Function TerminateProcess Lib "kernel32" ( _
      ByVal hProcess As Long, _
      ByVal uExitCode As Long) As Long
     
    Const STILL_ACTIVE = &H103
    Const PROCESS_ALL_ACCESS = &H1F0FFF
    Const PROCESS_TERMINATE = &H1
    ' Prüfen, ob ein Task mit einer bestimmten
    ' TaskID noch aktiv ist
    Public Function IsTaskActive(lTaskID As Long) As Boolean
      Dim lhwnd As Long
      Dim lExitCode As Long
     
      lhwnd = OpenProcess(PROCESS_ALL_ACCESS, False, lTaskID)
      Call GetExitCodeProcess(lhwnd, lExitCode)
      Call CloseHandle(lhwnd)
     
      IsTaskActive = (lExitCode = STILL_ACTIVE)
    End Function
    ' Task beenden
    Public Sub TerminateTask(lTaskID As Long)
      Dim lhwnd As Long
      Dim lResult As Long
     
      lhwnd = OpenProcess(PROCESS_TERMINATE, 0&, lTaskID)
      lResult = TerminateProcess(lhwnd, 1&)
      lResult = CloseHandle(lhwnd)
    End Sub

    Und um das ganze gleich einmal zu testen, plazieren Sie drei CommandButtons auf eine Form und nennen diese: cmdStart, cmdCheck und cmdExit. Über den ersten Button starten wir per Shell-Aufruf den Windows-Editor (Notepad). Den Rückgabewert des Shell-Aufruf (die TaskID) merken wir uns in der Variable lTaskID. Beim Klicken auf den 2. Button prüfen wir, ob die von uns aktivierte Instanz des Windows-Editor noch ausgeführt wird. Und über den dritten Button beenden wir Notepad letztendlich wieder.

    Und hier der Code:

    Option Explicit
     
    ' TaskID des von uns gestarteten Windows-Editor
    Private lTaskID As Long
    Private Sub cmdStart_Click()
      ' Notepad starten
      Dim sWinPath As String
     
      sWinPath = Environ("WinDir")
      If Right$(sWinPath, 1) <> "\" Then _
        sWinPath = sWinPath & "\"
     
      lTaskID = Shell(sWinPath & "notepad.exe", vbNormalFocus)
    End Sub
    Private Sub cmdCheck_Click()
      ' Prüfen, ob das von uns gestartete Notepad
      ' noch läuft
      If IsTaskActive(lTaskID) Then
        MsgBox "Notepad wird noch ausgeführt!"
      Else
        MsgBox "Notepad wurde bereits beendet!"
      End If
    End Sub
    Private Sub cmdExit_Click()
      ' Die von uns gestartete Notepad-Instant
      ' beenden
      If IsTaskActive(lTaskID) Then
        TerminateTask lTaskID
        MsgBox "Notepad wurde geschlossen."
      Else
        MsgBox "Notepad wird nicht mehr ausgeführt!"
      End If
    End Sub

    Dieser Tipp wurde bereits 43.547 mal aufgerufen.

    Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

    Über diesen Tipp im Forum diskutieren
    Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

    Neue Diskussion eröffnen

    nach obenzurück


    Anzeige

    Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
    (einschl. Beispielprojekt!)

    Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
    - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
    - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
    Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
     
       

    Druckansicht Druckansicht Copyright ©2000-2015 vb@rchiv Dieter Otter
    Alle Rechte vorbehalten.
    Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

    Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel