| Autor |
Beitrag |
White-Tiger
Hält's aus hier
Beiträge: 11
|
Verfasst: Di 30.09.08 18:51
Hallo,
Ich möchte ein fremdes Programm sauber beenden so das dieses noch selber auf das beenden reagieren kann.
Ich habe dazu auch schon einiges Probiert.. leider ohne erfolg bzw. ein mit erfolg nur das dann ein Windows Fehlersound kommt den ich nicht zuordnen kann.. da das Programm normal geschloßen wurde und auch mein Programm nicht rumeckert.
Der Funktionierende Code war/ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| function TaskClose(AHandle :HWND; AProcessID: DWord): LongBool; stdcall; var myProcessID: DWord; begin GetWindowThreadProcessId(AHandle, @myProcessID); if myProcessID=AProcessID then PostMessage(AHandle, WM_CLOSE, 0, 0); Result:= True; end; function TaskEnd(const AExeName: string): boolean; var p: TProcessEntry32; h,ph: THandle; begin Result:= false; p.dwSize:= SizeOf(p); h:= CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(h, p) then repeat if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then Result:= EnumWindows(@TaskClose, p.th32ProcessID) until (not Process32Next(h, p)) or Result; finally CloseHandle(h); end; end; |
Nur dieser Code greift eigentlich auf ein Fenster zu um das Programm zu beenden.. wie gesagt das Programm schließt sich auch normal.. aber danach kommt halt ein Windows Fehler Sound..
Probiert habe ich auch schon via OpenProcess(PROCESS_ALL_ACCESS, false, p.th32ProcessID); den Handle des Programms zu bekommen.. allerdings bringt mir das nichts bei PostMessage() da dies ein Fenster Handle will.. und mein Programm eigentlich keins hat..
Daher ist meine Frage wie kann ich ein Programm schließen anhand der ProzessID
Ich bedanke mich schon im vorraus über eventuelle Hilfe.
P.S. ich hatte mittlerweile gesammt 3-6 Stunden nach was passendem gegooglet.. enteder ich bin zu bläd für google oder keine Ahnung.. ich fand jedenfalls nichts...
MfG
White-Tiger
Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 30.09.2008 um 19:53
 ... sry war wohl falscher bereich... wusste ich nicht tut mir leid
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 05.10.08 17:00
Was ist das denn für ein Programm? Jedes Windows-Programm hat normalerweise ein Fenster, und sei es ein unsichtbares.
Da es also anscheinend ein Konsolenprogramm ist, da könntest du versuchen, die Tastendrücke zu simulieren, die es normal schließen.
Aber ohne mehr über das Programm zu wissen, kann man nix genaueres sagen. 
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 05.10.08 17:26
jaenicke hat folgendes geschrieben : | | Jedes Windows-Programm hat normalerweise ein Fenster, und sei es ein unsichtbares. |
Vielleicht hilft da der Taskmanager von Yogu: www.delphi-forum.de/...ighlight=taskmanager
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
White-Tiger 
Hält's aus hier
Beiträge: 11
|
Verfasst: So 05.10.08 17:40
es handelt sich um TeamSpeak2 Server oder hat das ein Fenster.. wie gesagt der Code oben verursacht nach dem beenden vom TS Server einen Fehler Sound... nur ich kann keinen Fehler sehn^^ Das ist mein eigentliches Problem..
edit:
dazu kommt das wenn man z.B. einen Dienst hat... der ja auch kein Fenster hat, aber als normaler Prozess auftauchen kann... da müsste es doch auch eine Art geben dem zu sagen beende sich ohne das man das über die Dienst Ansteuerung macht... oder seh ich das falsch?
edit² [nach dem unteren Thread]
Hmm.. dann hat sich glaub ich edit 1 mehr oder weniger geklärt^^
Bin nen edit freak 
Zuletzt bearbeitet von White-Tiger am So 05.10.08 17:46, insgesamt 3-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 05.10.08 17:43
[Antwort vor deinem Edit  ]Ja, auch ein Dienst hat Fenster, zwar keine sichtbaren Fenster, aber ein Fensterhandle, denn sonst wäre ja keine Kommunikation möglich.[/Antwort]
Warum da der Fehlersound kommt, das müsste ich mal testen.
|
|
White-Tiger 
Hält's aus hier
Beiträge: 11
|
Verfasst: So 05.10.08 17:54
Hier noch mal die funktion... wurde nen bissle optimiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| procedure TaskClose(const AExeName: string); function TaskCloseFunc(AHandle :HWND; AProcessID: DWord): LongBool; stdcall; var myProcessID: DWord; begin GetWindowThreadProcessId(AHandle, @myProcessID); if myProcessID=AProcessID then PostMessage(AHandle, WM_CLOSE, 0, 0); Result:= TRUE; end; var p: TProcessEntry32; h: THandle; begin p.dwSize:= SizeOf(p); h:= CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0); try if Process32First(h, p) then repeat if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then begin EnumWindows(@TaskCloseFunc, p.th32ProcessID); end; until (not Process32Next(h, p)); finally CloseHandle(h); end; end; |
Aber daran dürfte es nicht liegen... habe den fehler sound aber auch nur bei TeamSpeak Server... soweit ich es getestet habe^^
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 06.10.08 08:55
jaenicke hat folgendes geschrieben : | [Antwort vor deinem Edit ]Ja, auch ein Dienst hat Fenster, zwar keine sichtbaren Fenster, aber ein Fensterhandle, denn sonst wäre ja keine Kommunikation möglich.[/Antwort] |
Warum hat ein Dienst zwingendermaßen ein Fenster? Zur Kommunikation bzw. Konfiguration sollte ein Deinst kein Fenster auf dem Benutzerdesktop anzeigen, da dies eine Sicherheitslücke darstellt. Denn dadurch wird eine Verbindung zwischen der "unsicheren" interaktiven WindowsStation und der "System"-WindowsStation geschaffen. Und ein Fenster auf dem Desktop in dem der Dienst läuft hat keinen Sinn, wenn es zur Kommunikation genutzt werden soll, da Fensterhandle Desktop spezifisch sind. Unter Windows Vista gibt es deshalb gar keine interaktiven Dienste mehr. Also eigentlich ist die gegenteilige Aussage "richtiger". Dienste haben kein Fenster.
Um eine Dienst sauber zu beenden, sollte man den Servicemanager-API-Funktionen benutzen. Dies setzt allerdings Administartive Rechte voraus.
|
|
White-Tiger 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mo 06.10.08 11:26
Anfangs hatte ich geschrieben das es Darum geht einen Dienst zu beenden^^
Eigentlich ja aber nur TS2 Server oder viel mehr jedes Programm.. und das eben ohne die "harte" variante wählen zu müssen.
TeamSpeak z.B. meldet sich bei allen Leuten die drauf sind ab... kann es aber nicht wenn es Terminiert wird^^
Die funktion die ich benutze geht zwar... nur ich bin mir nicht sicher ob TS2 nen Fenster hat bzw. es kommt nach dem es beendet wurde ein Fehler sound... und eben den möchte ich wenn möglich nicht haben.
Ansonsten... kann noch einer eine Aussage zu Diensten und Festern machen?
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 06.10.08 11:36
Der Teamspeak Server hat also kein Fenster. WIE beendest du den denn dann normal? (Damit dieser sich abmeldet wie du beschrieben hast)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 06.10.08 12:28
Luckie hat folgendes geschrieben : | jaenicke hat folgendes geschrieben : | [Antwort vor deinem Edit ]Ja, auch ein Dienst hat Fenster, zwar keine sichtbaren Fenster, aber ein Fensterhandle, denn sonst wäre ja keine Kommunikation möglich.[/Antwort] |
Warum hat ein Dienst zwingendermaßen ein Fenster? |
Also wenn ich mit den Delphi-Funktionen einen Service erstelle, dann habe ich soweit ich weiß das unsichtbare Application-Fenster, über das ich auch Botschaften empfange, unter anderem WM_ENDSESSION, wenn Windows beendet wird, etc.
Ob es auch eine Möglichkeit gibt, einen Service komplett ohne unsichtbare Fensterhandles für den Botschaftenempfang zu schreiben, weiß ich nicht, kann sein, wie dann die Kommunikation zur Steuerung des Dienstes durch den Dienstemanager funktioniert, weiß ich nicht.
|
|
White-Tiger 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mo 06.10.08 12:44
uall@ogc hat folgendes geschrieben : | | Der Teamspeak Server hat also kein Fenster. WIE beendest du den denn dann normal? (Damit dieser sich abmeldet wie du beschrieben hast) |
Tray Icon... wie gesagt kann sein das der auch nen Fenster hat... zumindest ist beim start so nen Bild da...
Wie dem auch sein.. ich kann Ihn ja auch mit der Oben genannten Funktion beenden... nur eben dieser blöde Fehler Sound dabei nervt.. und ich weiß nicht wo der Herkommt das sich der Server soweit ich es gesehn habe normal schließt...
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 06.10.08 13:57
Das Taryicon wird wohl vom Konfigurationsprogramm stammen, um den Dienst zu konfigurieren. Wenn du dieses Programm schliesst, hat das natürlich keinerlei auswirkungen auf den Dienst. aber läuft der Teamspeak Server denn wirklich als Dienst oder nicht?
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 06.10.08 14:11
Wenn man die entsprechenden Konfigurationsschritte macht, dann läuft er als Dienst, standardmäßig nicht, aber davon war ich eigentlich ausgegangen, dass er bei White-Tiger als Dienst konfiguriert ist.
Nach Luckies Beitrag ist mir gerade mal so aufgefallen, dass der Fehlersound daher rühren könnte, dass das Konfigurationsprogramm beendet wird, ohne dass der Dienst beendet wird, du also keinen Zugriff mehr über den vorgesehenen Weg auf den Dienst hast. Was beendest du?
Zuletzt bearbeitet von jaenicke am Mo 06.10.08 14:28, insgesamt 2-mal bearbeitet
|
|
White-Tiger 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mo 06.10.08 14:27
Mom.. also zum anfang sollte mal gesagt sein das ich den TeamSpeak Server so gelassen habe wie er ist
Also kein Dienst.
Allerdings beendet ein Dienst der TeamSpeak zuvor gestartet hat, diesen eben wieder... soweit ich es getestet habe entsteht dieser Sound auch nur wenn ich TeamSpeak über den Dienst beende.. andere Programme meine ich hatten das nicht..
Bin halt dabei einen TS2 Server Controller zu basteln.. derzeit überwacht es den Server status und startet Ihn gegebenenfalls neu. Beim beenden des Dienstes beendet eben dieser auch wieder TeamSpeak 2 Server.
Soll ich den Ganzen Code Posten? Wären dann aber 2 Units.. einmal die Haupt Unit und einmal der Thread der TS überwacht.
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 06.10.08 14:31
Also Moment, du hast selbst einen Dienst programmiert, der auf den TS-Server im Benutzerdesktop zugreift? Warum startest du nicht einfach den Server direkt als Dienst?
|
|
White-Tiger 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mo 06.10.08 14:50
Zum einen Kann sich TS nicht selber überwachen, keine geplanten Shutdowns ausführen mit Benachrichtigung auf allen Aktiven Servern, Floods überwachen, den bot.2x.to bot Starten und überwachen, keine TS Admin Client Like server Controlle per Programm bieten, Logs und Die Server Automatisch Backupen etc^^
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 06.10.08 14:55
Was ich meine: Das Problem ist aber, dass du von einem Dienst aus auf den TS-Server auf dem Benutzerdesktop zugreifst (mehrere TS-Server als Dienst ginge ja auch nicht). Entweder startest du den TS-Server selbst als Dienst, dann könnte der Zugriff gehen, oder solltest auch dein Überwachungsprogramm nicht als Dienst starten.
Unter XP kannst du die Interaktion mit dem Benutzerdesktop deinem Dienst erlauben, unter Vista nicht mehr.
Ich habe mich nicht damit beschäftigt, inwiefern man eine solche Überwachung einer Desktopanwendung trotzdem als Dienst implementieren kann, aber soweit ich das kenne hört sich das nach keiner guten Idee an.
// EDIT:
Aber da kennt sich Luckie besser aus  .
Zuletzt bearbeitet von jaenicke am Mo 06.10.08 14:56, insgesamt 2-mal bearbeitet
|
|
MagicRain
      
Beiträge: 154
WinXp, Win8, iOS
Delphi 7, Lazarus Pascal, Delphi 10.2 Starter, NetBeans Java
|
Verfasst: Mo 06.10.08 14:56
Also ich würde das via TaskKill und Timer machen....
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID),0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; procedure TForm1.taskkill2Timer(Sender: TObject); begin KillTask('NOTEPAD.EXE'); end; |
|
|
jaenicke
      
Beiträge: 19336
Erhaltene Danke: 1751
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 06.10.08 14:59
Damit stürzt du das Programm aber ab  , da ist die Lösung oben tausendmal besser.
// EDIT:
| MSDN Dokumentation hat folgendes geschrieben: | The TerminateProcess function is used to unconditionally cause a process to exit. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.
TerminateProcess initiates termination and returns immediately. This stops execution of all threads within the process and requests cancellation of all pending I/O. The terminated process cannot exit until all pending I/O has been completed or canceled.
A process cannot prevent itself from being terminated. |
|
|
White-Tiger 
Hält's aus hier
Beiträge: 11
|
Verfasst: Mo 06.10.08 15:03
Nur das bei nem Task kill alle User auf dem TS nen Disconnect nach 30Secunden bekommen und nicht wissen was los ist
Außerdem startet mein Dienst TeamSpeak.. daher startet es Ihn auch Als System... und nicht als ein bestimmter User...
Wie gesagt mein dienst kann TS auch killen bzw. normal beenden nur danach ist nen Fehlersound... der mich eigentlich nicht weiter stört aber ich find es unprofessionell
Und ich will das Programm eventuell auch veröffentlichen und nicht nur für meinen Hoster nutzen^^
Mir ging es im dem Thread auch nur ums allgemeine Beenden von Programmen.. aber wenn jedes nen Fenster hat dann müsste ja alles mit der Funktion die ich benutze gehn^^
Das mein Dienst ein Dienst ist hat den Grund das es A Beim Start Laufen soll was auch bedeutet das kein User eingeloggt sein soll (eben Server betrieb) und B selber keine Verwaltung hat.. außer eine übers Internet gesteuert
Wo dann eben die Admin Verwaltung für Kunden und Server betreiber möglich ist.. So brauchen die Kunden nicht mehr zwingend eine Webinterface und wir admins können den TS jeder zeit überwachen... und steuern
|
|