Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизПолучение иконки из EXE Найти похожие ветки
← →
Pit © (2006-01-30 13:05) [0]Люди добрые подскажите как вытащить иконку по имени окна программы.
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);
← →
Pit © (2006-01-30 13:21) [1]Удалено модератором
← →
azl © (2006-01-30 16:11) [2]http://www.users.on.net/johnson/resourcehacker/reshack.zip
← →
begin...end © (2006-01-30 16:51) [3]> Pit © (30.01.06 13:05)
> Люди добрые подскажите как вытащить иконку по имени окна
> программы.
Если проблема в том, как по хэндлу окна определить, какому процессу оно принадлежит, см. API-функции GetWindowThreadProcessId + OpenProcess + GetModuleFileNameEx.
← →
Pit © (2006-01-30 19:48) [4]СПАСИБО 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;
← →
Pit © (2006-01-30 19:53) [5]Постскриптум.
Да этоGetClassName(winHandel,buf,128);
можно вырезать случайно затесалось.
Всётаки не зря я сюда зашёл ,есть ещё на свете добрые люди.
← →
Джо © (2006-01-30 19:58) [6]> [4] Pit © (30.01.06 19:48)
Не мешало бы в этом коде проверять возвращаемые функциями значения.
← →
Pit © (2006-01-30 20:13) [7]Я начал изучать Delphi примерно полгода назад и до вчерашнего дня знал всего пару функций типа
FindWindow
иPostMessage
, зашёл вчера сюда и узнал много полезного типаGetWindowThreadProcessId
иGetModuleFileNameEx
за что большое СПАСИБО begin...end"у .
Джо можешь обьяснить что ты имеешь в виду проверять возвращаемые функциями значения, заранее спасибо.
← →
Джо © (2006-01-30 20:26) [8]> [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:47) [9]Теперь понял, но конечный код будет таким:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
winHandel:= WindowFromPoint(Mouse.CursorPos);
...
end;
← →
Pit © (2006-01-30 20:51) [10]Джо СПАСИБО за совет я это ценю, потому что по книгам найти что то ценное не реально.
← →
Джо © (2006-01-30 20:55) [11]> [9] Pit © (30.01.06 20:47)
> Теперь понял, но конечный код будет таким:
> procedure TForm1.Timer1Timer(Sender: TObject);
> begin
> winHandel:= WindowFromPoint(Mouse.CursorPos);
И где в нем проверка возвращаемого значения?
← →
Pit © (2006-01-30 21:09) [12]Я понял то что если каклулятор не запущен,
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 21:47) [13]> [12] Pit © (30.01.06 21:09)
> А проверка возвращаемого значения в данном случае мне не
> нужна потому что если WindowFromPoint не вернёт Handle
> это не страшно
Что ж, значит, ты ничего не понял.
← →
КиТаЯц © (2006-02-01 13:46) [14]Касательно поиска калькулятора...
FindWindow("SciCalc", nil {"Калькулятор" или "Calculator"???} );
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c