| Autor | Beitrag | 
| maxk 
          Beiträge: 1696
 Erhaltene Danke: 1
 
 Win XP, Debian Lenny
 Delphi 6 Personal
 
 | 
Verfasst: So 29.09.02 15:00 
 
Hi,
ich habe ein Fensterhandle eines Programms ermittelt und brauche nun aber auch den EXE-Dateinamen des Programms. Wie kann ich dies bewerkstelligen?
 
 maxk
 _________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
 | 
|  | 
| MathiasSimmack Ehemaliges Mitglied
 Erhaltene Danke: 1
 
 
 
 
 | 
Verfasst: 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. 
 Zuletzt bearbeitet von MathiasSimmack am Mo 30.09.02 10:19, insgesamt 1-mal bearbeitet
 | 
|  | 
| Motzi 
          Beiträge: 2931
 
 XP Prof, Vista Business
 D6, D2k5-D2k7 je Prof
 
 | 
Verfasst: So 29.09.02 18:51 
 
Unter Windows 2000 brauchst du dir gar nicht mühsam alle Prozesse auflisten sondern kannst einfach GetWindowThreadProcessID verwenden..! _________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
 | 
|  | 
| Luckie Ehemaliges Mitglied
 Erhaltene Danke: 1
 
 
 
 
 | 
Verfasst: Mo 30.09.02 01:21 
 
Nicht nur in Windows2000:
 	  | Zitat: |  	  | Minimum operating systems: Included in Windows 95, Windows NT 3.1
 
 | 
 | 
|  | 
| MathiasSimmack Ehemaliges Mitglied
 Erhaltene Danke: 1
 
 
 
 
 | 
Verfasst: 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 IDGetWindowThreadProcessID(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 
          Beiträge: 2931
 
 XP Prof, Vista Business
 D6, D2k5-D2k7 je Prof
 
 | 
Verfasst: 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..
 _________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
 | 
|  | 
| MathiasSimmack Ehemaliges Mitglied
 Erhaltene Danke: 1
 
 
 
 
 | 
Verfasst: Mo 30.09.02 09:36 
 
Bitte schön. Zur Ansicht und Kontrolle:
 												| 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  
          Beiträge: 1696
 Erhaltene Danke: 1
 
 Win XP, Debian Lenny
 Delphi 6 Personal
 
 | 
Verfasst: Di 08.10.02 10:58 
 
  Danke, es funzt..._________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
 | 
|  |