Главная страница
    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.51 MB
Время: 0.008 c
3-37494
dimm22
2003-12-15 13:17
2004.01.13
Максимальный размер файла IB. Во многих источниках видел, что


4-37984
DillerXX
2003-11-07 18:44
2004.01.13
Окна


1-37670
AGN
2003-12-29 16:09
2004.01.13
ListBox - подсказка для Items


14-37905
Wistler
2003-12-21 12:59
2004.01.13
Оптимальные деревья


14-37852
VEG
2003-12-22 22:12
2004.01.13
Самый быстрый алгоритм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский