Autor Thema: Windows-Programm durch Notes beenden  (Gelesen 2400 mal)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Windows-Programm durch Notes beenden
« am: 08.06.06 - 12:53:18 »
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

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Re: Windows-Programm durch Notes beenden
« Antwort #1 am: 08.06.06 - 13:41:32 »
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

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.
« Letzte Änderung: 08.06.06 - 14:30:06 von Untitled »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Windows-Programm durch Notes beenden
« Antwort #2 am: 08.06.06 - 14:09:52 »
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

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Re: Windows-Programm durch Notes beenden
« Antwort #3 am: 08.06.06 - 14:24:47 »
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.
« Letzte Änderung: 08.06.06 - 14:26:39 von Untitled »

Offline diali

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.023
  • Geschlecht: Männlich
Re: Windows-Programm durch Notes beenden
« Antwort #4 am: 08.06.06 - 14:25:40 »
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

da sollte was Dabei sein.
Gruß
Dirk

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Windows-Programm durch Notes beenden
« Antwort #5 am: 08.06.06 - 16:16:29 »
Vielen Dank, Moritz und Dirk - das bringt mich jetzt garantiert auf die richtige Lösung!

Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz