Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ICQ über eigenes Programm beenden (https://www.delphipraxis.net/86785-icq-ueber-eigenes-programm-beenden.html)

Mazel 19. Feb 2007 18:30


ICQ über eigenes Programm beenden
 
Hallo,

ich möchte ICQ über mein eigenes, speziell für mich organisiertes, Programm beenden.
Dazu habe ich mit EnumWindows mir alle Fenster auflisten lassen um, da das Programm nur für mich sein soll, das jeweilige Fenster zu wählen um es mit WM_CLOSE zu schließen. Ich dachte das richtige Fenster sei 'ICQNUMMER', dies ist aber nur die Liste meiner Kontakte nicht aber die Anwendung. Ich habe es dann mit dem Fenster 'ICQ Lite' versucht, leider hat dies auch nicht geklappt. Daher ermittle ich nun immer den Prozess von ICQ. Nun könnte ich mit TerminateProcess den Prozess radikal beenden, was aber nicht mein Ziel ist.

Was schlagt ihr vor?

Hier der Code in dem ich den Prozess ermittle und je nach Bedingung den Prozess beenden möchte:
Delphi-Quellcode:
function GetProcess(Process: String; KillProcess: Boolean): Boolean;
var
  hProcSnap     : THandle;
  pe32           : TProcessEntry32;

begin
 Result := False;
 hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
 If hProcSnap <> INVALID_HANDLE_VALUE then
  begin
   pe32.dwSize := SizeOf(ProcessEntry32);
   If Process32First(hProcSnap, pe32) then
    While Process32Next(hProcSnap, pe32) do
     begin
      If Pos(Process, LowerCase(pe32.szExeFile)) <> 0 then
       begin
        If KillProcess then
         begin
           ???
         end
        //If KillProcess then Result := TerminateProcess(OpenProcess(Process_Terminate, False, pe32.th32ProcessID), 0)
        Else Result := True;
        Break;
       end;
     end;
    CloseHandle(hProcSnap);
  end;
end;
Gruß
Mazel

Mazel 21. Feb 2007 13:15

Re: ICQ über eigenes Programm beenden
 
*push*

SirThornberry 21. Feb 2007 13:40

Re: ICQ über eigenes Programm beenden
 
hast du es schon mit wm_syscommand anstelle von wm_close probiert?

Mazel 21. Feb 2007 13:56

Re: ICQ über eigenes Programm beenden
 
Hallo,

nein, hab ich vorher noch nicht probiert aber eben und leider hat auch dies nicht geklappt, obwohl ich sicher bin das richtige Fenster zum Prozess 'ICQ Lite' sein müsste, weil nur dieses oder das mit der ICQ NUMMER exisitert und das mit der Nummer nur die Liste ist.

SirThornberry 21. Feb 2007 14:06

Re: ICQ über eigenes Programm beenden
 
hast du dir schonmal per WinSpy das Handle des Fensters (mit der ICQ-Nummer) geholt und dann die Message dort hinn geschickt? (sozusagen sicher gestellt das du auch das richtige Handle hast).
Und lässt sich das ICQ-Fenster über Alt+F4 beenden? wenn dem so ist müsste es auch per message funktionieren.

Mazel 21. Feb 2007 14:32

Re: ICQ über eigenes Programm beenden
 
Was ist WinSpy? Das kenn ich leider nicht.
Ich bin sicher, dass ich das richtige Handle des Fenster mit der ICQ-Nummer habe, denn dies funktioniert. Wenn die Liste im Vordergrund ist und ich WM_CLOSE sende an dieses Fenster sende, wird es geschlossen das funktoniert auch mit ALT + F4. Deshalb denke ich das es das Fenster 'ICQ Lite' sein müsste aber da passiert eben nichts.

Gibt es denn noch eine andere Möglickeit ICQ sanft zu beenden?

aegidos 19. Aug 2009 13:22

Re: ICQ über eigenes Programm beenden
 
Hy,
Ich habe versucht diesen Code mal in mein Projekt mit einzubauen.
Leider fehlt mir offensichtlihc noch eine uses direktive um alles zum laufen zu bekommen.

TProcessEntry32 sowie CreateToolHelp32SnapShot werden als undefinierte Bezeichner angekreidet.

Was muss ich denn noch für Systembibliotheken einbinden?

Danke schonmal und schöne Grüße
Andi

himitsu 19. Aug 2009 13:29

Re: ICQ über eigenes Programm beenden
 
OH > Delphi-Referenz durchsuchenCreateToolHelp32SnapShot

aber in soeinem Fall, wo die OH es mal nicht kennt...

Google > Bei Google suchenCreateToolHelp32SnapShot
DP > Hier im Forum suchenCreateToolHelp32SnapShot

oder ganz einfach

Suchen [Strg+F] (natürlich in Delphi) > In Dateien suchen > in Verzeichnissen inkl. Unterverzeichnisse
und da das Delphi-Source-Vereichnis (z.B. C:\Programme\Borland\Delphi7\Source ) = TlHelp32

Neutral General 19. Aug 2009 13:29

Re: ICQ über eigenes Programm beenden
 
Hi,

Es gibt noch einen anderen Weg. Einen, den ich meistens benutze:

Delphi-Quellcode:
var id: Cardinal;
     wnd, h: THandle;
begin
  wnd := FindWindow(*ICQ*);
  GetWindowThreadProcessID(wnd,id);
  h := OpenProcess(PROCESS_ALL_ACCESS,false,id);
  TerminateProcess(h);
end;
Gruß
Neutral General

aegidos 19. Aug 2009 13:53

Re: ICQ über eigenes Programm beenden
 
Hy Danke für die schnelle Hilfe.

Der Process den ich beenden möchte hat kein Window daher habe ich die oben vorgestellte Funktion benutzt.
Zitat:

OH > CreateToolHelp32SnapShot

aber in soeinem Fall, wo die OH es mal nicht kennt...
Ja genau die OH hat mich im Stich gelassen
Zitat:

Google > CreateToolHelp32SnapShot
findet man mittlerweile sooo viel das es echt Zeitaufwändig ist die ganzen Informationen zu selektieren, denn unter den ersten 20 Treffern muss ich ganz ehrlich sagen habe ich bei google nicht gefunden dass man in der uses Direktive TlHelp32 hinzufügen muss !

Zitat:

DP > CreateToolHelp32SnapShot

oder ganz einfach

Suchen [Strg+F] (natürlich in Delphi) > In Dateien suchen > in Verzeichnissen inkl. Unterverzeichnisse
und da das Delphi-Source-Vereichnis (z.B. C:\Programme\Borland\Delphi7\Source ) = TlHelp32
Das hats gebracht auch wenns bei mir hier versteckt war:
C:\Program Files\CodeGear\RAD Studio\5.0\source\Win32

Diese Art der Suche bringt mich nun hoffentlich immer schneller ans Ziel wenn ich mal wieder nicht weiss was ich für Bibliotheken benutze bei meinem Copy Paste Code :-D

DANKE !!! @himitsu: du bist ja auch 10mal schneller als google ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz