Форум: "WinAPI";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
ВнизОкно и его .exe Найти похожие ветки
← →
Sergio_BC (2003-06-03 16:04) [0]Подскажите кто знает плз как для чужого окна узнать какой процесс его запустил? (в смысле путь к экзешнику)?
Зарание спасибо.
← →
DVM (2003-06-03 16:09) [1]GetWindowThreadProcessId
← →
Sergio_BC (2003-06-03 16:13) [2]Это пол дела. А как из ProcessId получить путь и имя исполняемого файла?
← →
DVM (2003-06-03 16:21) [3]GetModuleFileName
← →
DVM (2003-06-03 16:23) [4]Вот так получится наверное:
function GetWindowPath(Wnd:HWND):string;
var
hInst: THandle;
Path: array [0..MAX_PATH] of char;
nLen: integer;
begin
hInst := GetWindowLong(Wnd, GWL_HINSTANCE);
GetModuleFileName(hInst, Path, MAX_PATH);
nLen:=lstrlen(Path);
while (nLen > 0) and (Path[nLen] <> "\") do dec(nLen);
Path[nLen+1] := #0;
result:=Path;
end;
← →
Sergio_BC (2003-06-03 16:30) [5]Получилось!!!
Спасибо большое.
← →
R4D][ (2003-06-04 12:25) [6]Instance имеет смысл только для твоего приложения. Как у тебя получилось не пойму. Я недавно поднимал здесь этот вопрос и вот к чему мы пришли:
uses TlHelp32;
var
...
ModuleName: string;
hSnsh, PrID: THandle;
pME: TModuleEntry32;
res: Boolean;
begin
...
// Получаешь ИД процесса
GetWindowThreadProcessId(WinHandle, @PrID);
WinInstance:=GetWindowLong(WinHandle,GWL_HINSTANCE);
// Создаешь снапшот дляч данного процесса с флагом
// TH32CS_SNAPMODULE - то есть включаешь в него информацию // о модулях данного процесса
hSnsh := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PrID);
// Проходишся по всем модулям
res := True;
Module32First(hSnsh, pME);
while res do
begin
if Longint(pME.modBaseAddr) = WinInstance then // Ты нашёл свой модуль
// (Инстанс и базовый адрес - по сути одно и то же)
begin
// Искомое имя
ModuleName := pME.szModule{szExePath};
Break;
end;
res := Module32Next(hSnsh, pME);
end;
// Освобождаешь снэпшот
CloseHandle(hSnsh);
За этот код отдельное спасибо reonid"у. Да и еще - этот код не будет работать в NT, но будет и в Win9x и в Win2000/XP. И еще я раскопал функцию GetModuleFileNameEx, у которой первый параметр - хэндл процесса, но она не работает в Win9x. Решать тебе.
← →
Sergio_BC (2003-06-05 14:58) [7]Конечно когда сказал шо работает погарячился.
Но тут мне уже посоветовали вот это, под 2000 работает:
function GetAppFileName (hWnd: THandle) :string;
var dPID: dWord;
hHandle: THandle;
begin
GetWindowThreadProcessId(hWnd, @dPID);
SetLength (Result, MAX_PATH);
hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, dPID);
if GetModuleFileNameEx (hHandle, 0, PChar (Result), MAX_PATH) > 0 then
SetLength (Result, StrLen (PChar (Result)));
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c