Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi EXE-/Modulname aus Fensterhandle ermitteln (https://www.delphipraxis.net/47275-exe-modulname-aus-fensterhandle-ermitteln.html)

Marphy 8. Jun 2005 17:50


EXE-/Modulname aus Fensterhandle ermitteln
 
Hallo zusammen,
meine Frage (diesmal ganz kurz :wink:):
Wie kann ich aus einem beliebigen, existierenden Fensterhandle [ IsWindow(MyHandle) = True ] dessen vollständigen EXE-/Modul-Dateinamen ermitteln?

Dass dies mit GetModuleFileName zu lösen ist, ist mit klar. Ich weiß nur nicht, wie man aus der hWnd das Instanzen-/Modul-Handle hInstance (bzw. hModule, ist das gleiche?) ermitteln kann.

Ich hoffe, ihr könnt mir da (mal wieder :mrgreen:) helfen...

Gruß, Marco

c113plpbr 8. Jun 2005 17:56

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Warum nimmst du nicht einfach GetWindowModuleFileName?

ciao, Philipp

DGL-luke 8. Jun 2005 18:06

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
weil er gerade gesagt hat, dass er nicht versteht, wie er es nutzen soll?

Olli 8. Jun 2005 18:15

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von DGL-luke
weil er gerade gesagt hat, dass er nicht versteht, wie er es nutzen soll?

Lies lieber nochmal. Es wurde eine komplett andere API vorgeschlagen ;)

Will sagen: Die Aussage von c113plpbr ist vollkommen zutreffend.

c113plpbr 8. Jun 2005 18:16

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von DGL-luke
weil er gerade gesagt hat, dass er nicht versteht, wie er es nutzen soll?

er weis nur nicht wie man GetModuleFileName benutzt, aber mit GetWindowModuleFileName könnte er es relativ einfach verstehen ... da seine frage sich ja eigentlich darauf bezog, wie man von einem fensterhandle über ein modulhandle zum Dateinamen kommt. Mit der von mir vorgeschlagenen Funktion fällt dieser Umweg weg.

[edit2]so, jetzt aber[/edit2]

ciao, Philipp

Marphy 8. Jun 2005 18:19

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Habe ich auch schon versucht, funktioniert aber irgendwie nicht (SetForeground mit der selben hWnd aber schon, außerdem erst ab NT SP3)... :?

Gruß, Marco

DGL-luke 8. Jun 2005 18:20

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
oha, ja, sorry. da hab ich mich verlesen...

Olli 8. Jun 2005 18:23

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von Marphy
Habe ich auch schon versucht, funktioniert aber irgendwie nicht (SetForeground mit der selben hWnd aber schon, außerdem erst ab NT SP3)... :?

GWL_HINSTANCE und GetWindowLong() sind deine Freunde. Hilft allerdings nicht viel, weil das Instanzenhandle in deinem Prozess vermutlich genau deine EXE identifiziert.

c113plpbr 8. Jun 2005 19:52

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Zitat:

Zitat von Olli
GWL_HINSTANCE und GetWindowLong() sind deine Freunde. Hilft allerdings nicht viel, weil das Instanzenhandle in deinem Prozess vermutlich genau deine EXE identifiziert.

Dazu gibts ja eigentlich GetModuleFilenameEx, allerdings akzeptiert das dieses Handle nicht ... warum auch immer ... daher empfehle ich die untenstehende lösung ...
Zitat:

Zitat von Marphy
Habe ich auch schon versucht, funktioniert aber irgendwie nicht

Seltsam ... na dann probier mal das:
Delphi-Quellcode:
uses PsApi;

(*...*)

var
  hwnd_ : HWND;
  PID : Cardinal;
  hProc : Cardinal;
  Buffer : array[0..MAX_PATH - 1] of Char;
  modules : array of HModule;
  modulecount : cardinal;
begin
  hwnd_ := FindWindow('Notepad', nil);

  GetWindowThreadProcessId(hwnd_, PID);
  hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);

  EnumProcessModules(hProc, nil, 0, modulecount);
  SetLength(modules, modulecount div SizeOf(HModule));
  EnumProcessModules(hProc, PDWord(@modules[0]), modulecount, modulecount);

  GetModuleFilenameEx(hProc, modules[0], @Buffer[0], MAX_PATH);

  ShowMessage(string(Buffer));

  CloseHandle(hProc);
end;
Is natürlich auch wieder NT-only ... aber wenn das auch ned funktioniert, dann schau mal, ob es nicht von irgendwas geblockt wird ... z.B. ZoneAlarm tut das manchmal ganz gern ... ^^

Und unter 9x-Systemen solltest du über GetWindowThreadProcessId die PID rausfinden können, und über CreateToolhelp32Snapshot, Process32First & Process32Next sämtliche Prozesse auflisten können. Du müsstest dann nurnoch die PID's vergleichen, und wenn du dann die richtige gefunden hast, einfach in szExeFile den Namen nachschauen ...

ciao, Philipp

Marphy 10. Jun 2005 21:11

Re: EXE-/Modulname aus Fensterhandle ermitteln
 
Hallo zusammen,
danke für eure Bemühungen!

Mit GetModuleFileName() funktioniert es nach wie vor nicht, sehr wohl aber mit GetModuleFileNameEx und einem vorgeschobenen OpenProcess. :dancer:
OpenProcess muss mit Zugriff PROCESS_QUERY_INFORMATION or PROCESS_VM_READ aufgerufen werden - hatte Letzteren bisher weggelassen, aber ohne ihn hat dat Janze dann eben nich funktioniert :x) :wink:

Gruß, Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:16 Uhr.
Seite 1 von 2  1 2      

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