Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Handle ermitteln (https://www.delphipraxis.net/66637-handle-ermitteln.html)

Martin K 1. Apr 2006 19:42


Handle ermitteln
 
Hi Leute,

habe mal eine Frage zu FindWindow:
Ist es irgendwie möglich, die Funktion mittels eines Dateinamen anstatt lpClassName aufzurufen?
Gibt es dafür eine andere Funktion, wie ich das Handle eines Programms mittels seines Dateinamen herausfinden kann?

z.B. wenn ich eingebe:
Delphi-Quellcode:
FindWindow('notepad',nil)
dann klappt das wunderbar.

Wenn ich aber z.B. das Handle vom Windows Media Player haben will:
Delphi-Quellcode:
FindWindow('wmplayer',nil)
oder
Delphi-Quellcode:
FindWindow('Windows Media Player',nil)
funktioniert nicht.
Deshalb wollte ich es über den FileName machen, aber da komme ich nicht weiter... :gruebel:

toms 1. Apr 2006 19:45

Re: Handle ermitteln
 
Hallo,

Bei mir findet es den MP so:
Delphi-Quellcode:
FindWindow('WMPlayerApp','Windows Media Player');
Zitat:

Deshalb wollte ich es über den FileName machen, aber da komme ich nicht weiter...
Waere eine Moeglichkeit, jedoch wird's dann komplizierter.
Zudem koennen zu einem Prozess mehrere Fenster gehoeren. Dann muesstest du noch das richtige finden.

Martin K 1. Apr 2006 19:49

Re: Handle ermitteln
 
Danke erstmal, werd ich gleich ausprobieren.

Ich wollte es halt nur allgemein, also für JEDES Programm machen, deshalb über FileName...

Martin K 1. Apr 2006 19:54

Re: Handle ermitteln
 
Zitat:

Zitat von toms
Zitat:

Deshalb wollte ich es über den FileName machen, aber da komme ich nicht weiter...
Waere eine Moeglichkeit, jedoch wird's dann komplizierter.
Zudem koennen zu einem Prozess mehrere Fenster gehoeren. Dann muesstest du noch das richtige finden.

Naja, das mit den mehreren Fenstern kann man ja weglassen...
Meinetwegen kann der ganze Prozess beendet werden.

Wie würde das denn gehen?
Also Handle eines Prozesses erhalten ???

toms 1. Apr 2006 19:56

Re: Handle ermitteln
 
Zitat:

Zitat von Martin K
Danke erstmal, werd ich gleich ausprobieren.

Ich wollte es halt nur allgemein, also für JEDES Programm machen, deshalb über FileName...

Dann muesstest du aber jeden EXE-Namen kennen. Eine Datei kann man jedoch auch umbenennen.
Was genau moechtest du mit den Handles machen?

Martin K 1. Apr 2006 20:00

Re: Handle ermitteln
 
Also:
Ich starte zunächst ein Programm per ShellExecute.
Dieses Programm läuft im Hintergrund, also SW_Hide. Da der Nutzer deshalb dieses Programm dann nur im Taskmanager beenden kann, will ich es eben so beenden:
Delphi-Quellcode:
PostMessage(FindWindow('WMPlayerApp','Windows Media Player'),WM_SYSCOMMAND,SC_Close,0);
Da das Programm im Normalfall der Windows Media Player ist, funzt der Code auch.

Der Benutzer soll aber das Programm auch ändern können (also ein anderes Programm für die Musikwiedergabe), und eben dann habe ich ein Problem mit dem Beenden...

Zitat:

Zitat von toms
Dann muesstest du aber jeden EXE-Namen kennen. Eine Datei kann man jedoch auch umbenennen.

Nein, es soll nur ein Programm sein, dass der Nutzer angibt. Den FileName kenne ich also.

DGL-luke 1. Apr 2006 20:14

Re: Handle ermitteln
 
Kannst du nicht über MSDN-Library durchsuchenCreateProcess oder ähnliches das Handle des Prozesses "behalten" und dann per Kill-Message abschießen?

Martin K 1. Apr 2006 20:23

Re: Handle ermitteln
 
Ich will das Programm schon "ordentlich" beenden, also nicht killen.

Ich weiß zwar nicht, wie CreateProcess funktioniert, aber ich habe das schon ausprobiert:
Hab mir eine globale Integer-Variable genommen, in der das Handle meines Prozesses gespeichert wird.
Danach wollte ich dann das Programm zu diesem Handle beenden:
Delphi-Quellcode:
//Programm starten und Handle speichern
  FillChar(Info, SizeOf(Info), 0);
  Info.cbSize := SizeOf(Info);
  Info.Wnd := Application.Handle;
  Info.fMask := SEE_MASK_NOCLOSEPROCESS;
  Info.lpVerb := PChar('open');
  Info.lpFile := PChar('C:\Programme\Windows Media Player\wmplayer.exe');
  Info.nShow := SW_Hide;
  ShellExecuteEx(@Info);
  x := exInfo.hProcess; //x habe ich als globale Integer-Variable deklariert


//dann Beenden:
  PostMessage(x,WM_SYSCOMMAND,SC_Close,0);
Der Code hat aber leider nicht funktioniert...

Luckie 1. Apr 2006 20:32

Re: Handle ermitteln
 
Ein Prozess-Handle ist ja auch kein Fensterhandle.

Also damit es mit einem Dateinamen funktioniert:
1. Alle Prozesse auflisten (Forensuche)
2. Die dazugehörigen ProzssIDs und Dateinamen holen
3. Alle Fenster(handles) holen (Forensuche)
4. Vergleichen welches Handle zur ProzessID passt mit MSDN-Library durchsuchenGetWindowThreadProcessId.

toms 1. Apr 2006 20:34

Re: Handle ermitteln
 
Schaut euch mal diesen Thread an. (vorallem letzte Antwort)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 Uhr.
Seite 1 von 3  1 23      

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