Текущий архив: 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.51 MB
Время: 0.009 c