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

Вниз

Окно и его .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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.015 c
9-20376
VitGun
2003-02-09 16:32
2003.08.07
Drawrotate в delphiX


1-20525
Timur
2003-07-24 19:52
2003.08.07
Файлы *.*bin


4-20848
iNew
2003-06-05 09:59
2003.08.07
Прогресс копирования файлов в SHFileOperation


1-20569
odyssey
2003-07-24 09:56
2003.08.07
цвет шрифта в ячейке StrigGrid


3-20452
Theoden
2003-07-17 15:19
2003.08.07
drag&drop