AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fenster-Icon aus hWnd ermitteln

Ein Thema von Marphy · begonnen am 10. Jun 2005 · letzter Beitrag vom 17. Mär 2011
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#21

Re: Fenster-Icon aus hWnd ermitteln

  Alt 18. Jun 2005, 09:32
Zitat von SirThornberry:
(z.B.: bekomm ich damit nicht das Icon des Source-Code-Fensters von Delphi7 oder das icon von dem Fenster auf dem das Menü sich in Delphi befindet)
Bei mir zeigt's auch diese Icons an.. (fuer D6 & D2005)
Poste doch mal einen Fenster Screenshot, damit wir auch sicher von denselben Icons sprechen.
Thomas
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#22

Re: Fenster-Icon aus hWnd ermitteln

  Alt 18. Jun 2005, 12:54
Hallo zusammen,
danke erstmal an dich Toms für die Bereitstellung deines Codeschnipsels (und die Erweiterung der Demo ).

Unter http://www.swissdelphicenter.ch/de/showcode.php?id=628 habe ich auch einen Codeausschnitt gefunden, der das Fenstericon ebenfalls über GetClassLong() + GCL_HICON auszulesen versucht. Dieser hat mich aber nicht überzeugt, da nur das große Icon zurückgeliefert wird, was nicht bei allen Anwendungen gut funktioniert.

Über GCL_HICONSM kann man auch das kleine Icon auslesen, was Toms' Code ja demonstriert. Das funktioniert meistens auch ganz gut, aber eben auch nicht immer:
  • Hat der ein oder andere von euch AntiVir PE (laufen)? Bei mir wird statt dem roten Schirm-Icon des AntiVir Guard ("AnitVir PersonalEdition Classic - Guard") nur das Standard-Anwendungs-Icon angezeigt.
  • Bei mir tritt das gleiche Problem wie bei SirThornberry auf: Gebt mal "fMain.pas" als Fenstertitel ein. Obwohl das Codefenster ein kleines Icon in der Titelleiste besitzt, kann nur das große ermittelt werden.
  • Bei manchen Programmen wird als kleines Icon das große Icon ermittelt, dieses wird dann entsprechend auf 16x16 Pixel zugeschnitten.
Außerdem: Wie wird eigentlich das große Icon ermittelt? Eigentlich existiert ja nur ein kleines Icon in der Titelleiste, woher kommt dann das 32x32-Symbol?

Im Anhang findet ihr zu den einzelnen Punkten Screenshots...

Gruß, Marco
Miniaturansicht angehängter Grafiken
gwi1_170.jpg   gwi2_182.jpg   gwi3_114.jpg  
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#23

Re: Fenster-Icon aus hWnd ermitteln

  Alt 21. Jun 2005, 11:12
Hey Toms, noch da?
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#24

Re: Fenster-Icon aus hWnd ermitteln

  Alt 21. Jun 2005, 19:19
Zitat von Marphy:
Hey Toms, noch da?
Jawohl....

Habe den Code noch etwas veraendert.
Nun zeigt's bei AntiVir PE das richtige grosse Icon an, beim kleinen aber
ein anderes.

Delphi-Quellcode:
  hIcone := SendMessage(WinHandle, WM_GETICON, ICON_SMALL, 0);
  if hIcone = 0 then
    hIcone := HICON(GetClassLong(WinHandle, GCL_HICONSM));
  Image1.Picture.Icon.Handle := hIcone;
  // get big Icon
  hIcone := SendMessage(WinHandle, WM_GETICON, ICON_BIG, 0);
  if hIcone = 0 then
    hIcone := HICON(GetClassLong(WinHandle, GCL_HICON));
  Image2.Picture.Icon.Handle := hIcone;
Angehängte Dateien
Dateityp: zip getwindowicon_184.zip (245,2 KB, 10x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#25

Re: Fenster-Icon aus hWnd ermitteln

  Alt 22. Jun 2005, 15:48
Hallo toms,
danke für dein Posting! Ja, an die Mäglichkeit, beide Varianten zu kombinieren, habe ich auch schon gedacht.

Funktioniert aber leider immer noch nicht einwandfrei:
Bei Opera 8 z.B. wird kein kleines Icon ermittelt (siehe Anhang).
Außerdem wird nach wie vor bei manchen Anwendungen bei SMALL_ICON das BIG_ICON ermittelt und auf 16x16 zugeschnitten. Ein Programm davon ist der ApiGuide, welchen man unter http://www.mentalis.org/agnet/appdown.shtml herunterladen kann.

Irgendwie muss es doch eine Lösung geben?

Gruß, Marco
Miniaturansicht angehängter Grafiken
opera_131.jpg  
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#26

Re: Fenster-Icon aus hWnd ermitteln

  Alt 22. Jun 2005, 19:54
Habe unter Google folgenden Code gefunden, um das kleine, grosse Icon zu erhalten.

Vielliecht hast du Zeit, das schnell unter Delphi auszuprobieren.

Code:
00306 HICON get_window_icon_small(HWND hwnd)
00307 {
00308         HICON hIcon = 0;
00309 
00310         SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
00311 
00312         if (!hIcon)
00313                 SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
00314 
00315         if (!hIcon)
00316                 SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
00317 
00318         if (!hIcon)
00319                 hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
00320 
00321         if (!hIcon)
00322                 hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);
00323 
00324         if (!hIcon)
00325                 SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hIcon);
00326 
00327         return hIcon;
00328 }
00329 
00330 HICON get_window_icon_big(HWND hwnd, bool allow_from_class)
00331 {
00332         HICON hIcon = 0;
00333 
00334         SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
00335 
00336         if (!hIcon)
00337                 SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
00338 
00339         if (!hIcon)
00340                 SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
00341 
00342         if (allow_from_class) {
00343                 if (!hIcon)
00344                         hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);
00345 
00346                 if (!hIcon)
00347                         hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
00348         }
00349 
00350         if (!hIcon)
00351                 SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hIcon);
00352
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#27

Re: Fenster-Icon aus hWnd ermitteln

  Alt 22. Jun 2005, 20:13
Und hier die Delphi Umsetzung:

Delphi-Quellcode:
const
  ICON_SMALL2 = 2;

function get_window_icon_small(hwnd: HWND): HICON;
var
  Icon: HICON;
begin
  Icon := 0;
  SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, DWORD(Icon));

  if Icon = 0 then
    SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, DWORD(Icon));

  if Icon = 0 then
    SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, DWORD(Icon));

  if Icon = 0 then
    Icon := HICON(GetClassLong(hwnd, GCL_HICONSM));

  if Icon = 0 then
    Icon := HICON(GetClassLong(hwnd, GCL_HICON));

  if Icon = 0 then
    SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, DWORD(Icon));

  Result := Icon;
end;


function get_window_icon_big(hwnd: HWND; allow_from_class: Boolean): HICON;
var
  Icon: HICON;
begin
  Icon := 0;
  SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, DWORD(Icon));

  if Icon = 0 then
    SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, DWORD(Icon));

  if Icon = 0 then
    SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, DWORD(Icon));

  if allow_from_class then
  begin
    if Icon = 0 then
      Icon := HICON(GetClassLong(hwnd, GCL_HICON));

    if Icon = 0 then
      Icon := HICON(GetClassLong(hwnd, GCL_HICONSM));
  end;

  if Icon = 0 then
    SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, DWORD(Icon));

  Result := Icon;
end;
Angehängte Dateien
Dateityp: zip getwindowicon_993.zip (265,5 KB, 15x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#28

Re: Fenster-Icon aus hWnd ermitteln

  Alt 23. Jun 2005, 17:15
Hallo Toms,
danke für deine Bemühungen! Die dargebrachte Lösung funktioniert nun größten Teils.

Ich habe das Ganze noch ein wenig überarbeitet und die Kernfunktionen in eine eigene Unit gepackt... Das Projekt kann im Anhang heruntergeladen werden.

Gruß, Marco

P.S.: Testet den Code doch mal und postet eure Ergebnisse! Danke.
Angehängte Dateien
Dateityp: zip getwindowicon_172.zip (228,3 KB, 10x aufgerufen)
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#29

Re: Fenster-Icon aus hWnd ermitteln

  Alt 23. Jun 2005, 17:35
Hi Marco,

Habe den Code noch ein wenig erweitert.
Nun kann man die Icons auch im Ico Format speichern.
Brauchte dafuer eine andere Unit, da TIcon mit Farbverlust speichert.
Angehängte Dateien
Dateityp: zip getwindowicon_153.zip (275,9 KB, 15x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#30

Re: Fenster-Icon aus hWnd ermitteln

  Alt 23. Jun 2005, 18:19
Hi Toms,
hat dir das Edit-Menü so gefallen?

Leider enthält die Zip-Datei nicht alle Units...

Gruß, Marco
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz