Delphi-PRAXiS

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)

Martin K 1. Apr 2006 20:42

Re: Handle ermitteln
 
Danke, aber ich glaube, ich werde mich bei meinem Programm doch auf den Windows Media Player beschränken, da ich noch andere Probleme habe und die ganze Sache sonst zu komplex wird.
Bei dem ganzen handelt es sich um einen Bildschirmschoner, bei dem ich im Hintergrund Musik mit dem Windows Media Player wiedergeben will. Wer keinen Windows Media Player installiert hat, muss eben auf die Hintergrundmusik verzichten...

toms 1. Apr 2006 20:44

Re: Handle ermitteln
 
Zitat:

Zitat von Martin K
Bei dem ganzen handelt es sich um einen Bildschirmschoner, bei dem ich im Hintergrund Musik mit dem Windows Media Player wiedergeben will. Wer keinen Windows Media Player installiert hat, muss eben auf dei Hintergrundmusik verzichten...

Du koenntest die Hintergrundmusik auch mit dem TMediaPlayer (od. TBassPlayer etc) abspielen lassen.

Luckie 1. Apr 2006 20:45

Re: Handle ermitteln
 
Warum unbedingt ein FDremdprogramm benutzen? Wie wäre es mit der Hier im Forum suchenbass.dll? Hättest du gleich mal gesagt wozu du das brauchst, dann hätte man dir schon viel eher Alternativen aufzeigen können.

Daniel G 1. Apr 2006 20:51

Re: Handle ermitteln
 
PlaySound() mit all ihren Parametern?

Martin K 1. Apr 2006 20:58

Re: Handle ermitteln
 
Nein, nein, nein....

Bei TMediaPlayer und bassdll gehen glaub ich immer nur eine Datei. Und bei PlaySound sogar nur WAV und nicht einmal MP3's.
Und wer will schon immer den gleichen Song haben?
Schonmal was von Playlist gehört?

Luckie 1. Apr 2006 21:04

Re: Handle ermitteln
 
Wer hindert dich daran deinen eigenen MP3-Player mit Playlist zu implementieren?

Martin K 1. Apr 2006 21:08

Re: Handle ermitteln
 
Wie geht das?

MrKnogge 1. Apr 2006 21:11

Re: Handle ermitteln
 
du spielst einfach ein lied nach dem anderen ab !?

Luckie 1. Apr 2006 21:12

Re: Handle ermitteln
 
Bitte erstell für eine neue Frage einen neuen Thread mit einen sinnvollen Titel. Desweiteren könnte dir auch schon die Suche weiterhelfen.

Rastaman 1. Apr 2006 21:14

Re: Handle ermitteln
 
Wozu muss der WMP offen sein, mit der Wunschplaylist des Users, und du bringst ihn nur zum Abspielen.
Wenn der User Musik haben möchte drückt er schon selber auf Play. Lass die Musik einfach weg.

Martin K 1. Apr 2006 21:19

Re: Handle ermitteln
 
Zitat:

Zitat von Rastaman
Wozu muss der WMP offen sein, mit der Wunschplaylist des Users, und du bringst ihn nur zum Abspielen.
Wenn der User Musik haben möchte drückt er schon selber auf Play. Lass die Musik einfach weg.

Ist halt nur eine Option in den Einstellungen, man kann die Musik als Benutzer natürlich auch ganz weglassen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr.

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