Получение значка формы, когда я знаю дескриптор формы

#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;