Ha! Ich kann mal dem grossen Bernhard helfen! Welch Freude ;D
Declare Function WaitForSingleObject Lib "kernel32" (Byval hHandle As Long, Byval dwMilliseconds As Long) As Long
Declare Function CloseHandle Lib "kernel32" (Byval hObject As Long) As Long
Declare Function OpenProcess Lib "kernel32" (Byval dwDesiredAccess As Long, Byval bInheritHandle As Long, Byval dwProcessId As Long) As Long
Declare Function TerminateProcess Lib "kernel32" (Byval hProcess As Long, Byval uExitCode As Long) As Long
Const INFINITE = -1&
Const SYNCHRONIZE = &H100001
Sub Click(Source As Button)
Dim Task&, Handle&, Result&
Dim WaitMillis As Long
WaitMillis = 2000 '2 Sekunden
Task = Shellid("calc.exe", SHELL_MIN_NO_FOCUS)
Handle = OpenProcess(SYNCHRONIZE, False, Task)
Result = WaitForSingleObject(Handle, WaitMillis)
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
Hinweis: Teste, ob das auch unter Windows ME, '98 und '95 funktioniert.
Grüsse
Moritz
EDIT: Damit nicht jemand auf die Nase fällt, weil er zuerst meinen Code ausprobiert, habe ich ihn nun auch an Bernhards Code im unteren Beitrag angepasst.
Herzlichen Dank, Moritz - das ist genau das, was ich suchte. By the way - so gross bin ich gar nicht - knappe 1,90 ;D
Zusatzfrage: Was wäre, wenn ich die Task NICHT selbst starte, sondern diese bereits läuft und ich diese "abschiessen" möchte?
Bernhard
Anbei der VB-Code von Moritz, wie er unter LS funktioniert:
Declare Function WaitForSingleObject Lib "kernel32" (Byval hHandle As Long, Byval dwMilliseconds As Long) As Long
Declare Function CloseHandle Lib "kernel32" (Byval hObject As Long) As Long
Declare Function OpenProcess Lib "kernel32" (Byval dwDesiredAccess As Long, Byval bInheritHandle As Long, Byval dwProcessId As Long) As Long
Declare Function TerminateProcess Lib "kernel32" (Byval hProcess As Long, Byval uExitCode As Long) As Long
Const INFINITE = -1&
Const SYNCHRONIZE = &H100001
Sub Click (Source As Button)
Dim Task&, Handle&, Result&
Dim WaitMillis As Long
WaitMillis = 2000 '2 Sekunden
Task = Shellid ("calc.exe", SHELL_MIN_NO_FOCUS)
Handle = OpenProcess(SYNCHRONIZE, False, Task)
Result = WaitForSingleObject(Handle, WaitMillis)
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
habe gerade keine Zeit es zu testen, aber schau Dir mal folgendes an:
Programm Starten und beenden
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (Byval lpClassName As String, Byval lpWindowName As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (Byval hwnd As Long, Byval wMsg As Long, Byval wParam As Long, lParam As Long) As Long
Sub Click(Source As Button)
flag = Shell("Calc.exe", 1)
Msgbox "Programm wurde gestartet"
Dim lpClassName As String
Dim lpCaption As String
Dim Handle As Long
Const NILL = 0&
Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060&
lpClassName = "SciCalc"
lpCaption = "Rechner"
'Handel suchen
Handle = FindWindow(lpClassName$, lpCaption$)
'exit an Programm senden
Handle = SendMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, NILL)
Msgbox "Programm wurde beendet"
End Sub
da sollte was Dabei sein.