Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.46 MB
Время: 0.009 c
7-20817
Шурик Ш
2003-05-26 14:28
2003.08.07
(OFF) Максимальный размер винта


1-20615
Sabor
2003-07-24 19:40
2003.08.07
реестр


14-20733
Tahion2
2003-07-20 01:30
2003.08.07
Посоветуйте хорошую замену DBGrid-у


1-20603
stud
2003-07-24 14:52
2003.08.07
обращение к объекту по имени


14-20694
vidiv
2003-07-23 12:09
2003.08.07
Предложение для Админов форума.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский