![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение списка иконок из экзешника по хендлу окна этого приложе
leonidus © (2006-12-08 14:54:00)Мастера подскажите пожалуйста, у меня есть хендл окна, как мне узнать к какому приложению это окно относится и как следствие путь к его экзешнику, для того что бы выковырять из него иконки?
Орион (2006-12-09 00:44:00) [1]> [9] BiN © (09.12.06 00:23)
зато у моего велосипеда рама разноцветная :))
BiN (2006-12-09 00:23:00) [2]
> Орион © (08.12.06 16:02) [3]
Всё то же самое делается одной функцией GetModuleFileNameEx
Орион (2006-12-08 16:33:00) [3]+ для того чтобы GetPathFromId работала нужен файлик Native.pas, который также можно найти в сети.
И небольшая оговорка: работать, естественно, будет только на NT-системах.
Орион (2006-12-08 16:31:00) [4]> [6] leonidus © (08.12.06 16:23)
передаем ProcessID.
DWORD GetWindowThreadProcessId(
HWND hWnd, // handle of window
LPDWORD lpdwProcessId // address of variable for process identifier
);
leonidus (2006-12-08 16:23:00) [5]Орион, на вход вашей функции подаем хендл id потока возаращаемый GetWindowThreadProcessId ?
novill (2006-12-08 16:06:00) [6]Если я знал точное решение, я бы написал.
Потом можно попробовать GetModuleFileName. Но если потом неосновной, сработает ли - я не знаю. Возможно надо будет искать родителя.
ЗЫ Если получится - выложи код.
Орион (2006-12-08 16:03:00) [7]это для определение пути к екзешнику.
Дальше извлекаешь иконки из файла. Благо в интернете примеров навалом.
Орион (2006-12-08 16:02:00) [8]
TProcessBasicInformation = record
ExitStatus: Integer;
PebBaseAddress: Pointer;
AffinityMask: Integer;
BasePriority: Integer;
UniqueProcessID: Integer;
InheritedFromUniqueProcessID: Integer;
end;
function GetPathFromId(Id: DWord): string;
var
ProcessHandle: THandle;
ProcInfo: TProcessBasicInformation;
BytesRead: DWord;
Usr, Buf: DWord;
Len: Word;
Buffer: PWideChar;
begin
Result:='';
ZeroMemory(@ProcInfo, SizeOf(TProcessBasicInformation));
if GetProcessHandle(Id, ProcessHandle, PROCESS_QUERY_INFORMATION or PROCESS_VM_READ) then
begin
if NT_SUCCESS(NtQueryInformationProcess(ProcessHandle, ProcessBasicInformation, @ProcInfo, SizeOf(TProcessBasicInformation), nil)) then
begin
ReadProcessMemory(ProcessHandle, Pointer(DWord(ProcInfo.PebBaseAddress)+$10), @Usr, 4, BytesRead);
ReadProcessMemory(ProcessHandle, Pointer(Usr+$38), @Len, 2, BytesRead);
GetMem(Buffer, Len);
try
ReadProcessMemory(ProcessHandle, Pointer(Usr+$3C), @Buf, 4, BytesRead);
ReadProcessMemory(ProcessHandle, Pointer(Buf), Buffer, Len, BytesRead);
Result:=WideCharToString(Buffer);
finally
FreeMem(Buffer);
end;
SetLength(Result, Len div 2);
end;
NtClose(ProcessHandle);
end;
end;
leonidus (2006-12-08 15:46:00) [9]Ок, получу я идентификатор породившего окно потока что дальше делать.
novill (2006-12-08 15:35:00) [10]как вариант первого шага GetWindowThreadProcessId