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

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

Получение иконки из EXE [D7, XP]


Pit ©   (2006-01-30 13:05:00) 

Люди добрые подскажите как вытащить иконку по имени окна программы.
var
A: array [0..78] of Char;
winHandel: hWnd;
begin
winHandel:= FindWindow(nil,'Calculator');

            ...

            StrPCopy(A, 'полный путь.exe');
Image1.Picture.Icon.Handle := ExtractIcon(HInstance, A, 0);


КиТаЯц   (2006-02-01 13:46:00) [1]

Касательно поиска калькулятора...
FindWindow(' SciCalc', nil {'Калькулятор' или 'Calculator'???} );


Джо   (2006-01-30 21:47:00) [2]

> [12] Pit ©   (30.01.06 21:09)
> А проверка возвращаемого значения в данном случае мне не
> нужна потому что если WindowFromPoint не  вернёт Handle
> это не страшно

Что ж, значит, ты ничего не понял.


Pit   (2006-01-30 21:09:00) [3]

Я понял то что если каклулятор не запущен, FindWindow(nil,'Calculator');
его не найдёт и вернёт 0 , не найдется сответственно и File Path,потому я изменил код и теперь дальнейший код имеет смысл.
А проверка возвращаемого значения в данном случае мне не нужна потому что если WindowFromPoint не  вернёт Handle это не страшно.
Исходный код проги выглядит пока вот так:
procedure TForm1.Timer1Timer(Sender: TObject);
var
buf: array [0..128] of Char;
a: array [0..128] of Char;
winHandel: hWnd;
ProcessId: DWORD ;
ModHandle: DWORD ;
ProcessHandle: THandle;
windInfo: integer;
curPos: TPoint;
begin
winHandel:= WindowFromPoint(Mouse.CursorPos);
GetWindowText(winHandel,buf,128);
Edit1.Text:= buf;
GetClassName(winHandel,buf,128);
Edit2.Text:= buf;
windInfo:= GetWindowLong(winHandel,GWL_ID);
Edit3.Text:= FloatToStr(windInfo);
GetCursorPos(curPos);
Edit4.Text:= 'X:' + IntToStr(curPos.X) + '  ' + 'Y:' + IntToStr(curPos.Y) ;
ModHandle:= GetClassLong(winHandel,GCL_HMODULE);
GetWindowThreadProcessId(winHandel,ProcessId);
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, ProcessId);
GetModuleFileNameEx(ProcessHandle,ModHandle,buf,128);
Edit6.Text:= buf;
StrPCopy(a,buf);
Image1.Picture.Icon.Handle := ExtractIcon(HInstance, A, 0);
Image2.Picture.Icon.Handle := ExtractIcon(HInstance, A, 1);


Джо   (2006-01-30 20:55:00) [4]

> [9] Pit ©   (30.01.06 20:47)
> Теперь понял, но конечный код будет таким:
> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
> winHandel:= WindowFromPoint(Mouse.CursorPos);

И где в нем проверка возвращаемого значения?


Pit   (2006-01-30 20:51:00) [5]

Джо СПАСИБО за совет я это ценю, потому что по книгам найти что то ценное не реально .


Pit   (2006-01-30 20:47:00) [6]

Теперь понял, но конечный код будет таким:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
winHandel:= WindowFromPoint(Mouse.CursorPos);


...

end;


Джо   (2006-01-30 20:26:00) [7]

> [7] Pit ©   (30.01.06 20:13)
> Джо можешь обьяснить что ты имеешь в виду проверять возвращаемые
> функциями значения, заранее спасибо.

Например:
winHandel:= FindWindow(nil,'Calculator');
Если окно с заголовком 'Calculator' не будет найдено, то дальнейший код не имеет смысла, поэтому следует сделать, например, так:

winHandel:= FindWindow(nil,'Calculator');
if winHandle <> 0 then
begin
 // тут весь дальнейший код
end
else
 RaiseLastOsError; // генерируем исключение "по факту" или иным образом реагируем на эту ситуацию

В таком роде.


Pit   (2006-01-30 20:13:00) [8]

Я начал изучать Delphi примерно полгода назад и до вчерашнего дня знал всего пару функций типа FindWindowи PostMessage, зашёл вчера сюда и узнал много полезного типа
GetWindowThreadProcessIdи
GetModuleFileNameEx
за что большое СПАСИБО begin...end'у .
Джо можешь обьяснить что ты имеешь в виду проверять возвращаемые функциями значения, заранее спасибо.


Джо   (2006-01-30 19:58:00) [9]

> [4] Pit ©   (30.01.06 19:48)

Не мешало бы в этом коде проверять возвращаемые функциями значения.


Pit   (2006-01-30 19:53:00) [10]

Постскриптум.
Да это GetClassName(winHandel,buf,128);
можно вырезать случайно затесалось.
Всётаки не зря я сюда зашёл ,есть ещё на свете добрые люди.


Pit   (2006-01-30 19:48:00) [11]

СПАСИБО   begin...end опять меня спас, всё работает идиально, и Спасибо ещё раз за прошлый совет.

procedure TForm1.Button1Click(Sender: TObject);
var
buf: array [0..128] of Char;
a: array [0..128] of Char;
winHandel: hWnd;
ProcessId: DWORD ;
ModHandle: DWORD ;
ProcessHandle: THandle;
begin
winHandel:= FindWindow(nil,'Calculator');
GetClassName(winHandel,buf,128);
ModHandle:= GetClassLong(winHandel,GCL_HMODULE);
GetWindowThreadProcessId(winHandel,ProcessId);
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, ProcessId);
GetModuleFileNameEx(ProcessHandle,ModHandle,buf,128);
Edit1.Text:= buf;
StrPCopy(a,buf);
Image1.Picture.Icon.Handle := ExtractIcon(HInstance, A, 0);
end;


begin...end   (2006-01-30 16:51:00) [12]

> Pit ©   (30.01.06 13:05)

> Люди добрые подскажите как вытащить иконку по имени окна
> программы.

Если проблема в том, как по хэндлу окна определить, какому процессу оно принадлежит, см. API-функции GetWindowThreadProcessId + OpenProcess + GetModuleFileNameEx.


azl   (2006-01-30 16:11:00) [13]

http://www.users.on.net/johnson/resourcehacker/reshack.zip


Pit   (2006-01-30 13:21:00) [14]

Удалено модератором


Наверх

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