Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0147: Fremde Anwendung nach vorgegebener Zeitspanne beenden

 von 

Beschreibung 

Mit diesem Tip wird eine fremde Anwendung aufgerufen und solange mit dem Fortfahren des eigenen Programms gewartet, bis entweder das externe durch den Anwender oder nach Ablauf einer vorgegebenen Zeit beendet wird.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CloseHandle, OpenProcess, TerminateProcess, WaitForSingleObject

Download:

Download des Beispielprojektes [2,29 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "Text1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Declare Function WaitForSingleObject Lib "kernel32" _
        (ByVal hHandle As Long, ByVal dwMilliseconds As Long) _
        As Long

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 TerminateProcess Lib "kernel32" (ByVal _
        hProcess As Long, ByVal uExitCode As Long) As Long

Const INFINITE = -1&
Const SYNCHRONIZE = &H100000

Private Sub Form_Load()
  Text1.Text = 1000
End Sub

Private Sub Command1_Click()
  Dim Task&, Handle&, Result&
  
    Task = Shell("notepad.exe", vbNormalFocus)
    Handle = OpenProcess(SYNCHRONIZE, False, Task)
    
    Result = WaitForSingleObject(Handle, CLng(Text1.Text))
    AppActivate Me.Caption
    
    If Result Then
      Result = TerminateProcess(Handle, 0)
      Result = CloseHandle(Handle)
      MsgBox "Durch das Programm geschlossen"
    Else
      MsgBox "Durch den Anwender geschlossen"
    End If
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 11 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Johann Krez am 07.12.2006 um 09:44

Die Konstante SYNCHRONIZE sollte schon auf ihren Wert &H100000 bleiben. Auch braucht man keinen zweiten Handle und schon garnicht die aufwendigen Workaurounds, die hier sonst noch aufgeführt sind. Immer schön Faul bleiben ;)

Tipp: Die API Konstanten sind bewusst so gehalten das man sie in der Regel miteinander kombinieren kann.

Also noch schnell eine weitere Konstante PROCESS_TERMINATE definiert und in der Funktion OpenProzess mit den vorhandenen SYNCHRONIZE Flag kombiniert, sieht das ganze dann so aus:

Const SYNCHRONIZE As Long = &H100000
Const PROCESS_TERMINATE As Long = (&H1)
...
Task = Shell("notepad.exe", vbNormalFocus)
Handle = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, False, Task)

Funktioniert bestens sowohl unter W2k als auch XP! Vielleich kann jetzt auch jemand erklären warum die Tipps von M. Grube und F. Weiß funktionieren ;)

Kommentar von Michael Grube am 05.12.2003 um 10:40

An alle die wissen möchten wie es unter W2k funktioniert.

Die Syntax ist vollkommen richtig, jedoch die Konstante
von : 'Const SYNCHRONIZE = &H100000
muss auf: 'Const SYNCHRONIZE = &H100001
gesetzt werden!

Ich hoffe ich konnte helfen.
Bei mir funktioniert es unter Windows 2000

Kommentar von Felix Weiß am 13.06.2003 um 15:22

Funktioniert auch unter XP man braucht nur 2 handles. Eins zum warten, das andere zum schließen.
Hab es in eine Funktion gepackt:

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
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 TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000
Private Const Terminate_Process = &H1

Public Function CloseAPPafterTime(ProcessID As Long, MS As Long) As Boolean
Dim handle1 As Long, handle2 As Long, Result As Boolean

handle1 = OpenProcess(SYNCHRONIZE, False, ProcessID)
handle2 = OpenProcess(Terminate_Process, False, ProcessID)

Result = WaitForSingleObject(handle1, MS)
If Result Then TerminateProcess handle2, 0

CloseAPPafterTime = Result

CloseHandle handle1
CloseHandle handle2

End Function

Kommentar von Robin Stege am 27.03.2003 um 22:53

Man kann auch Trick 0124 verwenden und entsprechend anpassen. Dieser funktioniert unter XP!

Kommentar von Konrad Rudolph am 27.03.2003 um 22:28

an alle xp Benutzer:

Das Prinzip dieser Anwendung klappt unter Windows xp a priori wunderbar.
Tatsächlich scheint dieser Tip nicht zu funktionieren, was aber spezifisch ist.

Ein Workaround (falls es denn garnicht klappen sollte), wäre das Suchen des Fensterhandles des Fremdprogramms per FindWindow(Ex) und das Schließen per SendMessage, es muß als Message WM_DESTROY gesendet werden.

Kommentar von Robin Stege am 24.03.2003 um 10:26

Warum funktioniert Tipp 147 nicht unter XP?

Kommentar von marc waesche am 19.11.2002 um 19:55

Tja, bei meinem XP klappts auch nicht. Das Programm öffnet erst das Notebookfenster und behauptet dann nach einer Sekunde "vom Programm geschlossen". Doweit okay, nur stimmt´s nicht. :)

Tja, dann muß ich wohl wieder mal das Forum belästigen...
;)

Gruß Marc

Kommentar von paradox am 22.10.2002 um 19:41

also ich habs unter xp versucht und a gings nicht

Kommentar von PhilippVB am 21.03.2002 um 20:58

Unter Windows ME funktioniert es auch! Warum ist es da durchgestrichen??

Kommentar von Apfelbeck am 05.03.2001 um 09:52

Der Tip war super und mt einer kleinen Änderung:
Const Terminate_Process = &H1
und
Handle = OpenProcess(Terminate_Process, False, hProcessID)
funktioniert es dann auch gleich unter Win2k

Kommentar von Markus am 16.12.2000 um 17:05

Wie kann ich diesen Tipp unter Win2k realisieren??