Entwickler-Ecke
Windows API - Terminateprocess funzt nicht richtig
Reinhold666 - Do 22.06.06 01:07
Titel: Terminateprocess funzt nicht richtig
erstmal die Funktion :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function Killtask(const name:string):boolean; var p:TProcessEntry32; h:THandle; begin result:=false; p.dwSize:=Sizeof(p); h:=CreateToolHelp32snapshot(TH32CS_SnapProcess,0);
if Process32First(h,p) then repeat if AnsiLowerCase(Extractfilename(p.szExeFile))=AnsiLowerCase(name) then Result:=TerminateProcess(Openprocess(PROCESS_TERMINATE,BOOL(0),p.th32ProcessID),0); until (not Process32Next(h,p)) or Result; CloseHandle(h); end; |
jetzt steht im programm irgendwo:
Delphi-Quelltext
1:
| Killtask('blabla.exe'); |
-->Problem , es lassen sich nicht alle programme beenden.
wenn ich den namen des laufenden programmes angebe, zum beispiel , beendet es sich, so wie es auch soll..
allerdings lassen sich andere programme wie z.b. explorer.exe nicht beenden....
(anscheinend willkürlich, notepad.exe kann ich zum beispiel auch so beenden....anscheinend spielt es auch keine rolle von wem das programm gestartet wurde(sowohl notepad als auch explorer sind unter "Benutzer" am laufen))
woran liegts? hat mein programm keine rechte?muss ich andere parameter übergeben?oder hab ich einen fehler in der funtion?
danke im vorraus,
grüße , Reinhold
Moderiert von
raziel: Delphi-Tags hinzugefügt
Steve1024 - Do 22.06.06 09:13
Titel: WM_Close
Und wenn du an den Thread noch ein PostThreadMessage mit WM_Close oder so schickts??
Reinhold666 - Do 22.06.06 17:37
Delphi-Quelltext
1: 2: 3: 4: 5:
| repeat if AnsiLowerCase(Extractfilename(p.szExeFile))=AnsiLowerCase(name) then postthreadmessage(p.th32ProcessID,WM_CLOSE,0,0); until (not Process32Next(h,p)) or Result; |
is des richtig? wenn ja, dann funktioniert diese variante überhauptnicht(sendmessage und postmessage hab ich auchschon ausprobiert)
die sache ist schon irgendwie komisch, bei manchen programmen funktionierts , bei manchen nicht...mir gehts eigentlich huptsächlich um die explorer.exe...das verwirrende ist, das manchmal garnichts passiert(das ist auch richtig wenn der prozess nicht gefunden wird.....aber explorer.exe hab ich garantiert richtig geschrieben^^) und manchmal (aber auch nur manchmal(bis jetzt 2 mal)) nach dem beenden meines programmes der fehler kommt "Error <irgendwas> illegal handle"...
hab auch im i-net geschaut , aber nix hatt wirklich funktioniert... bin voll am verzweifeln :)
eine andere lösung währe auch wenn jemand wüsste wie man verhindert das die explorer.exe beim starten von win XP gestartet wird....(regestry wahrscheinlich(also bei win98 konnte man das im explorer schlüssel))....
greetz, Reinhold
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
Steve1024 - Do 22.06.06 18:13
also, wenn dir das reicht, dann schau mal im Library nach "Anwendung als erster staren" oder so...
Ich weiss nämlich nicht sicher, ob es das ist... aber kannst es ja mal ausprobieren....
RegValue
| Zitat: |
| HK_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\WinLogon\Shell |
von explorer.exe in dein App ändern...
außerdem meinte ich beise ausführen zu lassen... ich hatte damals sogar (glaube ich) drei Befehle benutzt.. alse Terminate, CloseHandle oder CloseProccess (k.A. mehr) und PostMessage bzw PosThreadMessage....
Das nächste wäre, dass du über FindWindowsEx oder durch OpenProccess dir das Fenster-Handle übergeben lässt und dort dann WM_Close hin sendest...
Reinhold666 - Do 22.06.06 19:34
super, vielen dank schonmal, hast mir schon viel weitergeholfen:)
also ich hab die explorer.exe durch mein programm ersetzt in der reg.
der explorer startet auch nichtmehr beim start, perfekt...
allerdings meoin programm auchnicht.... hab schon versucht es in den windows ordner zu kopieren und dann ohne pfadangabe einzutragen(wie der originaleintrag vom explorer) , klappt aber auchnich....
hab ausprobiert bei shell nichts anzugeben und mein programm in den autostart zu klatschen(bei ....Run in der reg)
aber das hat auchnicht gefunzt...
fazit: explorer startet nichtmehr, das gewünschte programm aber auchnicht...
hoffe du hast auch dafür eine lösung :) , thx im vorraus,
grüße Reinhold
Steve1024 - Fr 23.06.06 07:57
Also im Library steht, dass das Programm im "Windows\System32" Verzeichnis liegen soll... wenn ich mich recht erinnere...
Hast du das auch schon mal probiert??? Ansonsten schau doch mal einfach in der delphi-library.de...
Reinhold666 - Fr 23.06.06 19:49
Titel: hook
juhuuu, es klappt*freu*
hab die datei in den system32 ordner kopiert und jetz klappts, vielen dank!!!!!!!!!!!!
jetzt ist mein programm fast fertig,muss nurnoch schaffen strg+alt+entf und alt+tab abufangen...
gibts dafür ne andre möglichkeit als hooks?
irgendwie fenstermessage abfangen und mit ner konstanten für den jeweiligen befehl vergleichen oder so?
Delete - Fr 23.06.06 22:28
Titel: Re: hook
Reinhold666 hat folgendes geschrieben: |
jetzt ist mein programm fast fertig,muss nurnoch schaffen strg+alt+entf und alt+tab abufangen...
gibts dafür ne andre möglichkeit als hooks? |
Geht auch nicht mit Hooks, es sei den du meinst damit einen Tastaturtreiber. Einzige Möglichkeit ist es die Gina durch eine eigene zu ersetzen:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthn/security/winlogon_and_gina.asp
Und bevor du jetzt fragst: "Wie geht das?" Lass dir gesagt sein, dass dies zu erklären wohl mehrerer Seiten eines Buches füllen würde. Und ich kenne auch niemanden, der das schon mal gemacht hätte. Und die Personen, denen ich das zutraue sind vernünftig genug dies nicht zu tun. Aus welchen Grund willst du das denn unbedingt verhindern?
bf109g.01 - Do 26.08.10 17:12
Reinhold666 hat folgendes geschrieben : |
erstmal die Funktion :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function Killtask(const name:string):boolean; var p:TProcessEntry32; h:THandle; begin result:=false; p.dwSize:=Sizeof(p); h:=CreateToolHelp32snapshot(TH32CS_SnapProcess,0);
if Process32First(h,p) then repeat if AnsiLowerCase(Extractfilename(p.szExeFile))=AnsiLowerCase(name) then Result:=TerminateProcess(Openprocess(PROCESS_TERMINATE,BOOL(0),p.th32ProcessID),0); until (not Process32Next(h,p) )or Result; CloseHandle(h); end; | |
Was muss ich in die Uses Liste ergänzen? Das (fett) ist alles rot.
Ich versuche gerade so ein Programm zu bauen, um den IPodService automatisch zu beenden.
LG
Moderiert von
Narses: B- durch Highlight-Tags ersetzt
elundril - Do 26.08.10 17:15
Vermutlich TlHelp32.
lg elundril
Hidden - Do 26.08.10 19:16
Moin!
Luckie hat folgendes geschrieben : |
| Geht auch nicht mit Hooks, es sei den du meinst damit einen Tastaturtreiber. |
Der Process Explorer(
* [
http://technet.microsoft.com/de-de/sysinternals/bb896653.aspx]) von Sysinternals hat ja die Möglichkeit, den Windows-Taskmanager zu ersetzen.
Ich vermute mal, dass dies über einen Registry-Schlüssel läuft, in dem der Pfad zum Taskmanager liegt?
Oops, der Thread ist ja antik *auf feinen Pinsel wechselt*
bf109g.01 hat folgendes geschrieben : |
| Ich versuche gerade so ein Programm zu bauen, um den IPodService automatisch zu beenden. |
Vielleicht hilft es dir, das Ausführen des Programms unter den Windows-Dateioptionen\Sicherheit zu verbieten. Per
Ausführen als kannst du es immer noch manuell mit einem anderen Benutzerkonto starten.
Oder erstmal aus dem Autostart nehmen, aber da erzähle ich dir wahrscheinlich nichts neues. :mrgreen:
lg,
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!