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

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

Узнать путь к приложению, которое активно в данный момент


Страницы:   1 2

Felixx ©   (2003-11-07 13:30:00) 

Как узнать путь к файлу, который запущен в данный момент и окно которого является активный. Получаю хэндл активного окна, можно допустим узнать его заголовок с поможью функции getwindowtext. Есть ли функция для получения пути к файлу приложения.


Felixx   (2003-11-11 15:41:00) [1]

Где взять описание функций из PSAPI.PAS?


KosilkA   (2003-11-10 13:27:00) [2]

Вот выдрал из старых исходников ..возвращает строку-список с полными путями к запущенным процессам. В uses прописано tlhelp32,PsApi
................................

function ProcessByName:string;
var
hInstLib: THANDLE;
hInstLib2: THANDLE;
lpdwPIDs: PWordArray;
dwSize, dwSize2, dwIndex: DWORD;
hMod: HMODULE;
hProcess: THANDLE;
szFileName: array [0..MAX_PATH] of char;
lpfEnumProcesses: TEnumProcesses;
lpfEnumProcessModules: TEnumProcessModules;
lpfGetModuleFileNameEx: TGetModuleFileNameEx;
begin
hInstLib := LoadLibraryA("PSAPI.DLL");
if hInstLib = 0 then Exit;
hInstLib2 := LoadLibraryA("VDMDBG.DLL");
if hInstLib2 = 0 then Exit;
lpfEnumProcesses := GetProcAddress(hInstLib,"EnumProcesses");
lpfEnumProcessModules := GetProcAddress(hInstLib,"EnumProcessModules");
lpfGetModuleFileNameEx := GetProcAddress(hInstLib,"GetModuleFileNameExA");
if (Integer(@lpfEnumProcesses) = 0) or (Integer(@lpfEnumProcessModules) = 0) or
(Integer(@lpfGetModuleFileNameEx) = 0) then
begin
FreeLibrary(hInstLib);
FreeLibrary(hInstLib2);
Exit;
end;
dwSize2 := 256 * SizeOf(DWORD);
lpdwPIDs := nil;
repeat
if lpdwPIDs <> Nil then
begin
HeapFree(GetProcessHeap(),0,lpdwPIDs);
dwSize2 := dwSize2 * 2 ;
end;
lpdwPIDs := HeapAlloc(GetProcessHeap(),0,dwSize2);
if lpdwPIDs = Nil then
begin
FreeLibrary( hInstLib ) ;
FreeLibrary( hInstLib2 ) ;
Exit;
end;
if not lpfEnumProcesses(Pointer(lpdwPIDs),dwSize2,dwSize) then
begin
HeapFree(GetProcessHeap(),0,lpdwPIDs);
FreeLibrary( hInstLib ) ;
FreeLibrary( hInstLib2 ) ;
Exit;
end;
until(dwSize <> dwSize2);
dwIndex := 0;
while dwIndex < dwSize do
begin
szFileName[0] := #0;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ,FALSE,lpdwPIDs[dwIndex]);
if hProcess <> 0 then
begin
if lpfEnumProcessModules(hProcess,@hMod,sizeof(hMod),dwSize2) then
begin
if lpfGetModuleFileNameEx(hProcess,hMod,szFileName,
sizeof(szFileName)) = 0 then
szFileName[0] := #0;
end;
CloseHandle(hProcess);
if szfilename<>""then result:=result+szFileName+#13#10;;

end;
Inc(dwIndex);
end;
HeapFree(GetProcessHeap(),0,lpdwPIDs);
FreeLibrary(hInstLib2);
FreeLibrary( hInstLib ) ;
end;


Felixx   (2003-11-09 15:17:00) [3]

для Дубинин Алексей:

ответил на мыло


Felixx   (2003-11-09 15:01:00) [4]

для Игорь Шевченко:

а в win98 работает?


Дубинин Алексей   (2003-11-08 22:20:00) [5]

Felixx послушайся И. Шевченко...совсем недавно...поищи чуть ранние форумы...можешь по моей фамилии найти :-) Это я спрашивал такой же вопрос.
Если честно то используя ToolHelp ты сделал все правильно, и ты прав что, по крайней мере в ХР, выдается только имя...необходимо далее прочесть значения полученные не только через TProcessEntry32 но и через TModuleEntry32...тогда получишь путь. Если что могу выслать пример как все это делается. Пиши. А если быть честным, то мне сказали, что необходимо под ХР писать с использованием PsAPI. Как, пока не знаю, но думаю, что не сложнее чем ToolHelp. :-) Всем удачи!


Игорь Шевченко   (2003-11-08 19:00:00) [6]

Felixx (08.11.03 18:55) [21]

Почему поиском нельзя воспользоваться ? Я тут N постов назад давал функцию, которая по handle окна определяет командную строку для процесса этого окна, без psapi и без toolhelp, работает в NT4/Win2k/WinXP,
не постить же мне ее каждый раз ?


Felixx   (2003-11-08 18:55:00) [7]

Может надо использовать функции из библиотеки psapi.pas так как у меня Windows XP стоит.


Felixx   (2003-11-08 18:48:00) [8]

C @PrId всё работает без ошибок, но опять я получаю только имя файла, без пути.
Какая у вас винда стоит, и какая версия Delphi?


default   (2003-11-08 17:45:00) [9]

у меня всё ok и у Maxud ©-а видимо тоже
не знаю даже почему так....попробуй передать @PrId при объявлении var PrId: Cardinal


Felixx   (2003-11-08 17:33:00) [10]

У меня выдаёт ошибку, пишет что в GetWindowThreadProcessID(WinH, PrId); параметр PrId должен быть типа Pointer!


default   (2003-11-08 17:27:00) [11]

вот народ а, даёшь им готовый код они ещё и привередничают, ещё пытаются что-то исправить...
всё работает и возвращает как раз "C:\windows\EXPLORER.EXE"
если не можешь запустить ну ШО я могу сделать...


Felixx   (2003-11-08 15:05:00) [12]

Во-первых, правильнее наверное будет так:

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;

А во вторых, этот код возвращает мне только имя файла, например "EXPLORER.EXE" а мне нужно ещё и путь, то есть например "C:\windows\EXPLORER.EXE"


Maxud   (2003-11-07 22:17:00) [13]


> default © (07.11.03 20:59) [14]

Да,действительно... Спасибо, приму к сведению.


default   (2003-11-07 20:59:00) [14]

Maxud © (07.11.03 20:39) [13]
попробуй открой папку мои документы и глянь:
твоё выдаст имя dll, через tool help выдаст путь к explorer.exe


Maxud   (2003-11-07 20:39:00) [15]

А так разве нельзя?

procedure TfmMain.mnPathClick(Sender: TObject);
var h: hwnd;
s: array[0..MAX_PATH]of char;
begin
h:= GetForegroundWindow;
fillchar(s, sizeof(s), #0);
GetWindowModuleFileName(h, s, sizeof(s));
showmessage(s);
end;


default   (2003-11-07 20:27:00) [16]

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;


default   (2003-11-07 19:52:00) [17]

VMcL всё же расписал по пунктам


Felixx   (2003-11-07 19:11:00) [18]

Время пошло ;)
Жду... :)


WithOut Any ...   (2003-11-07 19:08:00) [19]

Необходимо время подумать


Felixx   (2003-11-07 19:03:00) [20]

Ну да, вы совершенно правы. Под активным приложением и понимается активное окно (которое в фокусе).
Получаю хэндл активного окна GetForegroundWindow
Получаю ID процесса GetWindowThreadProcessID
Как получить путь к файлу???


Страницы:   1 2

Наверх

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