Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.13;
Скачать: CL | DM;

Вниз

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

 
Felixx   (2003-11-07 13:30) [0]

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


 
Nazim   (2003-11-07 13:42) [1]

Побробуй ExtratctFilePath(FileName)


 
Felixx   (2003-11-07 14:00) [2]

Так не получится, я ведь не имени файла, ни пути не знаю. У меня в распоряжении только хэндл активного окна.


 
kDenis   (2003-11-07 14:35) [3]

GetActiveWindow возвращает хэндл активного окна, а дальше низнаю...


 
VMcL ©   (2003-11-07 15:07) [4]

1. GetForegroundWindow
2. GetWindowThreadProcessID
3. PsAPI and/or ToolHelp


 
Felixx   (2003-11-07 16:06) [5]

Что такое PsAPI and/or ToolHelp и как этим пользоваться?


 
Felixx   (2003-11-07 18:24) [6]

Может кто-нибудь всё-таки напишет, какую конкретно функцию из этих библиотек использовать и какие у неё параметры. А то что-то сам не разберусь.


 
WithOut Any ... ©   (2003-11-07 18:51) [7]

ИМХО все запущенные приложения активны. Видимо ты хотел спросить об окне (форме) на которой в данный момент фокус?


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

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


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

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


 
Felixx   (2003-11-07 19:11) [10]

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


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

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


 
default ©   (2003-11-07 20:27) [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;


 
Maxud ©   (2003-11-07 20:39) [13]

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

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:59) [14]

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


 
Maxud ©   (2003-11-07 22:17) [15]


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

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


 
Felixx   (2003-11-08 15:05) [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;

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


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

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


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

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


 
default ©   (2003-11-08 17:45) [19]

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


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

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


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

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


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

Felixx (08.11.03 18:55) [21]

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


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

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


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

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

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


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

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

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


 
KosilkA ©   (2003-11-10 13:27) [26]

Вот выдрал из старых исходников ..возвращает строку-список с полными путями к запущенным процессам. В 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-11 15:41) [27]

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



Страницы: 1 вся ветка

Текущий архив: 2004.01.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
1-37707
@tom
2003-12-24 20:28
2004.01.13
Ошибка загрузки файла в RichEdit


3-37553
axx
2003-12-15 15:22
2004.01.13
Передача параметров во Views


1-37736
serg128
2003-12-30 13:07
2004.01.13
Kak получить номер (индекс) выбранного узла в TTreeView?


7-37956
z_h_e
2003-10-29 20:27
2004.01.13
LPT


1-37772
sergwolf
2003-12-26 07:42
2004.01.13
Скиньте пожалуста пример файлового менеджера