Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определить путь к программе зная ее хендл окна [D7, WinXP]


Dmitry_177 ©   (2007-01-12 22:34:00) 

Подскажите пожалуйста, как определить путь к программе зная ее хендл окна?


Dmitry_177   (2007-01-13 01:33:00) [1]

Almaz, твой пример работает, спасибо )))


Dmitry_177   (2007-01-13 01:30:00) [2]


type
 TMaxPathString = array [0..MAX_PATH - 1] of Char;


Dmitry_177   (2007-01-13 01:29:00) [3]

Попробовал так.. не работает...(((


function GetFilePath(const WinH: THandle): String;
var
SnapshotH: THandle;
PE32: TProcessEntry32;
PrId: Cardinal;
AppFileName: TMaxPathString;
begin
Result := '';
SnapshotH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapshotH = -1 then Exit;
PE32.dwSize := SizeOf(PE32);
GetWindowThreadProcessID(WinH, PrId);
if Process32First(SnapshotH, PE32) then
repeat
if PE32.th32ProcessID = PrId then begin
Result := String(GetModuleFileName(PE32.th32ProcessID, AppFileName, SizeOf(AppFileName)));
Break;
end;
until not Process32Next(SnapshotH, PE32);
CloseHandle(SnapshotH);
end;


Almaz   (2007-01-13 01:21:00) [4]

Если не требуется поддержка Win95/98/МЕ, то можно через PSAPI:

function GetModuleFileNameEx(hProcess: THandle; hModule: THandle;
 lpFilename: PChar; nSize: Cardinal): Cardinal; stdcall;
 external 'Psapi.dll' name 'GetModuleFileNameExA';

function GetEXENameFromWnd(WndHandle: THandle): String;
var
 ProcessID: Cardinal;
 ProcessHandle: THandle;
 Buffer: array [0..MAX_PATH] of Char;
begin
 if GetWindowThreadProcessId(WndHandle, ProcessID) = 0 then
   RaiseLastOSError;
 ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or
   PROCESS_VM_READ, FALSE, ProcessID);
 if ProcessHandle = 0 then
   RaiseLastOSError;
 try
   if GetModuleFileNameEx(ProcessHandle, 0, Buffer, MAX_PATH) = 0 then
     RaiseLastOSError;
 finally
   CloseHandle(ProcessHandle);
 end;
 Result := Buffer;
end;


Удачи.


kaZaNoVa   (2007-01-13 01:18:00) [5]

Dmitry_177   (13.01.07 1:15) [6]
PE32.th32ProcessID попробуй ей скормить)))


Dmitry_177   (2007-01-13 01:15:00) [6]

читал про GetModuleFileName, но я не пойму как определить хэндл модуля, который используется в первом параметре этой функции.. Вставлял хэндл окна, она ничего не передает в буфер...(((


kaZaNoVa   (2007-01-13 01:04:00) [7]

GetModuleFileName


Dmitry_177   (2007-01-13 01:02:00) [8]

У меня почему-то определяется только как: "имя.exe". Без пути...((( А мне нужен еще и путь к нему...


kaZaNoVa   (2007-01-13 00:56:00) [9]


{uses tlHelp32; }

function GetFilePath(const WinH: THandle): String;
var
SnapshotH: THandle;
PE32: TProcessEntry32;
PrId: Cardinal;
begin

Result := '';
SnapshotH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapshotH = -1 then Exit;
PE32.dwSize := SizeOf(PE32);
GetWindowThreadProcessID(WinH, PrId);
if Process32First(SnapshotH, PE32) then
repeat
if PE32.th32ProcessID = PrId then begin
 Result := PE32.szExeFile;
 Break;
end;
until not Process32Next(SnapshotH, PE32);
CloseHandle(SnapshotH)

end;


Dmitry_177   (2007-01-13 00:26:00) [10]

Понадобилось...


kaZaNoVa   (2007-01-12 23:38:00) [11]

а зачемм???


Наверх

Титульная страница Поиск, карта сайта Написать письмо