Domino 9 und frühere Versionen > ND6: Entwicklung
Windows-Programm durch Notes beenden
koehlerbv:
Folgendes Problem:
Eine Notes-Applikation startet ein Windows-Programm. Nach einer bestimmten Zeitspanne soll dieses Programm aus dieser Notes-Applikation heraus auch wieder beendet werden - und der Notes-Client wieder im Fokus sein.
Hat ein WinAPI-Kundiger hier einen Rat für mich?
Vielen Dank im Voraus,
Bernhard
Untitled:
Ha! Ich kann mal dem grossen Bernhard helfen! Welch Freude ;D
--- Code: ---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
--- Ende Code ---
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.
koehlerbv:
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:
--- Code: ---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
--- Ende Code ---
Untitled:
Da wirds etwas kompliziert, weil du die Process-ID fürs ermorden haben musst.
Wie findest du den Prozess heraus? Hat der einen bestimmten Titel o.ä?
Hier ein Tipp, wies gemacht wird, wenn du die Nummer hast: http://www.activevb.de/tipps/vb6tipps/tipp0124.html
Moritz
P.S. Diese Tipps habe ich übrigens alle, wie Bernhard bereits bemerkt hat von Visual Basic geklaut. Und zwar von hier: http://www.activevb.de/tipps/index-tipps.html
Ist meiner Meinung nach die beste Windows API-Seite für VB und Notes.
diali:
habe gerade keine Zeit es zu testen, aber schau Dir mal folgendes an:
Programm Starten und beenden
--- Code: ---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
--- Ende Code ---
da sollte was Dabei sein.
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln