![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение иконки из 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]Удалено модератором