Главная страница
    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.007 c
1-20585
Иудд
2003-07-24 08:30
2003.08.07
Хеш


4-20845
Steven
2003-06-05 11:01
2003.08.07
Как сохранить файл с определенной датой изменеия?


8-20634
Buggy
2003-04-14 20:41
2003.08.07
Работа с MP3


14-20666
Rouse_
2003-07-21 01:41
2003.08.07
Мастера улыбаются - 4


1-20566
Yurique
2003-07-24 04:06
2003.08.07
No BDE





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