#windows #delphi #icons
#Windows #delphi #Значки
Вопрос:
Я пытаюсь получить значок формы и установить его на значок моего собственного приложения. Я нашел этот код, однако у меня он на самом деле не работает:
MyIcon := TIcon.Create;
Try
MyIcon.Handle := MyHandle;
MyForm.Icon := MyIcon;
Finally
MyIcon.Free;
End;
end;
Я попытался открыть приложение, у которого, как я знаю, есть определенный значок, я обнаружил, что это дескриптор, но значок, который показан в моем приложении, является значком Windows exe по умолчанию.
Есть идеи?
Комментарии:
1. (1) Является ли «форма» формой в вашем собственном приложении или окном во внешнем приложении? (2) Вам нужно только получить значок или вам нужно изменить значок формы (возможно, во внешнем приложении)?
2. MyForm — это моя собственная форма. Мне нужно изменить СВОЙ значок 🙂
3. Но если это ваша собственная форма, то, конечно, вы можете сделать просто
MyForm.Icon := MyIcon
илиMyForm.Icon.LoadFromFile()
или …?4. Хорошо, думаю, теперь я понимаю. «Установите его на мой собственный …» Сначала я подумал, что вы хотите изменить только что найденный значок, но вместо этого вы хотите использовать этот конкретный значок как свой собственный, верно? Вы имеете в виду «установить его как мой собственный …».
5. Приведенный выше код не работает, потому что после
MyForm.Icon := MyIcon
MyForm.Icon
иMyIcon
это один и тот же объект. Итак, когда вы освобождаетеMyIcon
, вы также освобождаетеMyForm.Icon
. Вместо этого вам следует использоватьMyForm.Icon.Assign(MyIcon)
. Или просто выполните,MyForm.Icon.ReleaseHandle
послеMyForm.Icon.Handle := HandleOfTheExternalIcon
чего вы получите, отправивWM_GETICON
сообщение во внешнее окно. То есть вы используетеWM_GETICON
для полученияHICON
изHWND
.
Ответ №1:
Чтобы ответить на вопрос в названии вашего поста:
Чтобы получить a TIcon
из HWND
, то есть получить значок, связанный с окном (не обязательно в вашем собственном приложении), сделайте что-то вроде
procedure TForm1.FormClick(Sender: TObject);
var
HIco: HICON;
Icon: TIcon;
begin
HIco := SendMessage(Handle, WM_GETICON, ICON_BIG, 0);
if HIco = 0 then
HIco := SendMessage(Handle, WM_GETICON, ICON_SMALL2, 0);
Icon := TIcon.Create;
try
Icon.ReleaseHandle;
Icon.Handle := HIco;
// Do something with Icon, for instance
Canvas.Draw(10, 10, Icon);
finally
Icon.Free;
end;
end;
Чтобы использовать значок HWND
окна в качестве значка вашей собственной формы, выполните
procedure TForm1.FormClick(Sender: TObject);
var
HWin: HWND;
HIco: HICON;
begin
HWin := FindWindow(nil, 'New file'); // A Rejbrand Text Editor window
HIco := SendMessage(HWin, WM_GETICON, ICON_BIG, 0);
if HIco = 0 then
HIco := SendMessage(HWin, WM_GETICON, ICON_SMALL2, 0);
Self.Icon.ReleaseHandle; // important!
Self.Icon.Handle := HIco;
end;