|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Определить имя файла по Handle окна
Доброго времени суток.
Как, зная хэндл (Handle: HWND) окна, определить ПОЛНОЕ имя приложения, которому оно принадлежит? Например, запущен Блокнот. Я знаю handle его окна типа HWND. Мне нужно получить "c:\WINDOWS\NOTEPAD.EXE". З.Ы. OS - Windows XP. Заранее спасибо! |
#2
|
||||
|
||||
Код:
GetModuleName(GetClassLong(handle,GCL_HMODULE)) handle - это тебе известно Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#3
|
|||
|
|||
тогда уж GetModuleFileName(Handle, PS, SizeOf(PS)). Но дело в том, что у меня все время возвращается имя моей проги (как ParamStr(0)), а не той, которой нужно по хэндлу... Видно дело в самом Handle.
|
#4
|
|||
|
|||
нет, хэндлы нормальные... ((
|
#5
|
||||
|
||||
Нужно подставлять handle найденного тобой окна, а не главного окна твоей проги.
PS функцию GetModuleFileName использовать таким образом нельзя, т.к. туда в качестве первого параметра надо передавать HMODULE запущенного модуля, а не Handle окна Велик и могуч наш Object Pascal ! ICQ: 357-591-887 Последний раз редактировалось Rokuell, 05.03.2009 в 16:37. |
#6
|
|||
|
|||
Так вот в том то и дело, что я в цикле подставляю хэндлы всех открытых окон, а каждый раз выдаются filename моей проги
|
#7
|
||||
|
||||
Может трохи криво, но...
Получаем ID процесса по имени файла: Код:
Function getProcessId(Exename:string):Dword; var snap:DWORD; pe:TprocessEntry32; begin result:=0; snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if snap <>INVALID_HANDLE_VALUE then begin pe.dwSize:=sizeof(TPROCESSENTRY32); if process32First(snap,pe) then repeat if pe.szExeFile=exename then begin result:=pe.th32ProcessID; closehandle(snap); exit; end; until not process32Next(snap,pe); closehandle(snap); result:=0; end; end; Получаем путь по ID: Код:
function GetProcessPath(ProcessId: DWORD; var Path:string): boolean; var ph: THandle; FileName: array[0..MAX_PATH-1] of Char; begin Result := false; ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,ProcessId); if ph <> 0 then try if GetModuleFileNameEx(ph,0,FileName,SizeOf(FileName)) > 0 then begin Path := ExtractFilePath(FileName); result := true; end; finally CloseHandle(ph); end; end; |
#8
|
|||
|
|||
TOJluK, спасибо, помогло Тему можно закрывать.
|