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

Вниз

Получение списка иконок из экзешника по хендлу окна этого приложе   Найти похожие ветки 

 
leonidus ©   (2006-12-08 14:54) [0]

Мастера подскажите пожалуйста, у меня есть хендл окна, как мне узнать к какому приложению это окно относится и как следствие путь к его экзешнику, для того что бы выковырять из него иконки?


 
novill ©   (2006-12-08 15:35) [1]

как вариант первого шага  GetWindowThreadProcessId


 
leonidus ©   (2006-12-08 15:46) [2]

Ок, получу я идентификатор породившего окно потока что дальше делать.


 
Орион ©   (2006-12-08 16:02) [3]


 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;


 
Орион ©   (2006-12-08 16:03) [4]

это для определение пути к екзешнику.
Дальше извлекаешь иконки из файла. Благо в интернете примеров навалом.


 
novill ©   (2006-12-08 16:06) [5]

Если я знал точное решение, я бы написал.

Потом можно попробовать GetModuleFileName. Но если потом неосновной, сработает ли - я не знаю. Возможно надо будет искать родителя.

ЗЫ Если получится - выложи код.


 
leonidus ©   (2006-12-08 16:23) [6]

Орион, на вход вашей функции подаем хендл id потока возаращаемый  GetWindowThreadProcessId ?


 
Орион ©   (2006-12-08 16:31) [7]

> [6] leonidus ©   (08.12.06 16:23)

передаем ProcessID.

DWORD GetWindowThreadProcessId(
   HWND hWnd, // handle of window
   LPDWORD lpdwProcessId  // address of variable for process identifier
  );


 
Орион ©   (2006-12-08 16:33) [8]

+ для того чтобы GetPathFromId работала нужен файлик Native.pas, который также можно найти в сети.
И небольшая оговорка: работать, естественно, будет только на NT-системах.


 
BiN ©   (2006-12-09 00:23) [9]


> Орион ©   (08.12.06 16:02) [3]

Всё то же самое делается одной функцией  GetModuleFileNameEx


 
Орион ©   (2006-12-09 00:44) [10]

> [9] BiN ©   (09.12.06 00:23)

зато у моего велосипеда рама разноцветная :))



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1176491619
Malik
2007-04-13 23:13
2007.05.06
Вотрос про массивы...


2-1176534590
vegarulez
2007-04-14 11:09
2007.05.06
Как правильно "растянуть" рисунок на кнопке?


5-1153210679
DevilDevil
2006-07-18 12:17
2007.05.06
Как отследить изменение размера TCustomControl компонента?


2-1176804210
dr_craigan
2007-04-17 14:03
2007.05.06
под окном


1-1173257292
tytus
2007-03-07 11:48
2007.05.06
Как перевести %USERPROFILE% - в C: Documents and Settings ...