![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как по ID процесса узнать главное его окно.
SottNick © (2002-11-28 07:24:00)Нужна функция обратная GetWindowThreadProcessId.
Перебор окон вряд ли подойдет.
Рабочая прога, выдающая нужный результат - Process Explorer от SysInternals.com
MikeZ (2002-11-28 15:25:00) [1]Код, который перебором выводит заглавие окна + имя файла. Если добавить несколько проверок, то будет выводить то, что нужно.
Procedure TForm1.Button1Click(Sender: TObject);
Var
// Uses TlHelp32
Window : HWnd;
hSn : THandle;
lppe : TProcessEntry32;
Buffer : Array[0..127] Of Char;
hProc : Cardinal;
Begin
//Ищем хендл верхнего окна
Window := GetForegroundWindow;
Repeat
If (Window <> Application.Handle) And
(GetWindowText(Window, Buffer, SizeOf(Buffer)) <> 0)
Then Begin
//Ищем ID процесса
GetWindowThreadProcessId(Window, @hProc);
//Делаем снимок процесса
hSn := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, hProc);
//Получаем список всех процессов
If Process32First(hSn, lppe) Then
Repeat
//Сравниваем ID и получаем имя ехе и путь ????????????????
If lppe.th32ProcessID = hProc Then
Begin
GetWindowText(Window, Buffer, SizeOf(Buffer));
{**********************}
ListBox1.Items.Add(Buffer + " (" + lppe.szExeFile + ")");
{**********************}
End;
Until Not Process32Next(hSn, lppe);
CloseHandle(hSn);
End;
//Ищем следующее окно
Window := GetNextWindow(Window, GW_HWNDNEXT);
Until Window = 0;
End;
Digitman (2002-11-28 08:26:00) [2]в отличии от ф-ции GetWindowThreadProcessId() , результат которой одназначен (вернуть идент-ры код.потока, создавшего некое интересующее окно, и процесса, породившего этот код.поток), "обратная" ф-ция таковой быть не может, ибо код.поток в ходе исполнения может создавать любое число окон (в т.ч. и вообще не создавать)
Song (2002-11-28 08:25:00) [3]Тем не менее именно перебором это и делается.