Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо