Entwickler-Ecke
Windows API - Fensterhandle -> Exedateiname
maxk - So 29.09.02 15:00
Titel: Fensterhandle -> Exedateiname
Hi,
ich habe ein Fensterhandle eines Programms ermittelt und brauche nun aber auch den EXE-Dateinamen des Programms. Wie kann ich dies bewerkstelligen?
maxk
Delete - So 29.09.02 18:43
Quelltext
1: 2:
| // alter Unit-Code entfernt um das Posting klein // zu halten und Peinlichkeiten zu verstecken ;o) |
Erfolgreich getestet unter 98, NT, 2000, & XP.
Mit Dank an NicoDE für sachkundige Hilfe.
Motzi - So 29.09.02 18:51
Unter Windows 2000 brauchst du dir gar nicht mühsam alle Prozesse auflisten sondern kannst einfach GetWindowThreadProcessID verwenden..!
Delete - Mo 30.09.02 01:21
Nicht nur in Windows2000:
| Zitat: |
Minimum operating systems: Included in Windows 95, Windows NT 3.1
|
Delete - Mo 30.09.02 07:04
| Motzi hat folgendes geschrieben: |
| Unter Windows 2000 brauchst du dir gar nicht mühsam alle Prozesse auflisten sondern kannst einfach GetWindowThreadProcessID verwenden..! |
| Luckie hat folgendes geschrieben: |
| Nicht nur in Windows2000 |
Solltet ihr da was übersehen haben?
Quelltext
1: 2:
| // get process ID GetWindowThreadProcessID(hWnd,@pid); |
Steht im Unit-Code - noch
vor der OS-Verzweigung. :?
Möglich, dass man die Funktion vereinfachen oder optimieren kann. Aber zumindest zeigt sie den tatsächlichen Dateinamen des jeweiligen Fenster-Handles an. Ich weiß nicht mehr, welches Programm das war - aber irgendein Prozessviewer zeigte mir Norton AntiVirus grundsätzlich als Pfad zur "explorer.exe" an.
Motzi - Mo 30.09.02 09:21
Was ich gemeint hab.. du kannst unter Win2k gleich die ProcessID verwenden um dir mit OpenProcess und GetModuleFileNameEx den Modul-Pfad zu besorgen.
Unter Win9x gibts die Funktion GetModuleFileNameEx ja leider nicht, also kommst du dort um die Process-Auflistung per ToolHelp Funktionen nicht herum, aber unter Win2k kannst du dir das sparen..
Delete - Mo 30.09.02 09:36
Bitte schön. Zur Ansicht und Kontrolle:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| unit pathfinder;
interface
uses Windows, tlhelp32, psapi;
// find path via Handle function GetEXEFromHandle(wnd: HWND) : string;
implementation
// find .EXE path via Handle function GetEXEFromHandle(wnd: HWND) : string; var pid : dword; wv : TOSVersionInfo; hProcess : THandle; ContinueLoop : boolean; aProcessEntry32 : TProcessEntry32; buf : array[0..MAX_PATH]of char; begin // re-set Result := '';
// nothing, exit if(wnd = 0) then exit;
// get running OS ZeroMemory(@wv,sizeof(TOSVersionInfo)); wv.dwOSVersionInfoSize := sizeof(TOSVersionInfo); GetVersionEx(wv);
// get process ID GetWindowThreadProcessID(wnd,@pid);
// get filename case wv.dwPlatformId of VER_PLATFORM_WIN32_NT: begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false,pid); if(hProcess <> INVALID_HANDLE_VALUE) then try if(GetModuleFileNameEx(hProcess,0,buf,MAX_PATH) > 0) then Result := string(buf); finally CloseHandle(hProcess); end; end; VER_PLATFORM_WIN32_WINDOWS: begin hProcess := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hProcess <> INVALID_HANDLE_VALUE) then try aProcessEntry32.dwSize := sizeof(aProcessEntry32); ContinueLoop := Process32First(hProcess,aProcessEntry32);
while(integer(ContinueLoop) <> 0) do begin if(aProcessEntry32.th32ProcessID = pid) then Result := aProcessEntry32.szExeFile; ContinueLoop := Process32Next(hProcess,aProcessEntry32); end; finally CloseHandle(hProcess); end; end; end; end;
end. |
maxk - Di 08.10.02 10:58
:P Danke, es funzt...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!