Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fenster-Icon aus hWnd ermitteln (https://www.delphipraxis.net/47420-fenster-icon-aus-hwnd-ermitteln.html)

toms 18. Jun 2005 08:32

Re: Fenster-Icon aus hWnd ermitteln
 
Zitat:

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.

Marphy 18. Jun 2005 11:54

Re: Fenster-Icon aus hWnd ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 3)
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

Marphy 21. Jun 2005 10:12

Re: Fenster-Icon aus hWnd ermitteln
 
Hey Toms, noch da? :(

toms 21. Jun 2005 18:19

Re: Fenster-Icon aus hWnd ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

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;

Marphy 22. Jun 2005 14:48

Re: Fenster-Icon aus hWnd ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
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: :x
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? :wall:

Gruß, Marco

toms 22. Jun 2005 18:54

Re: Fenster-Icon aus hWnd ermitteln
 
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

toms 22. Jun 2005 19:13

Re: Fenster-Icon aus hWnd ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
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;

Marphy 23. Jun 2005 16:15

Re: Fenster-Icon aus hWnd ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Toms,
danke für deine Bemühungen! Die dargebrachte Lösung funktioniert nun größten Teils. :-D

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. :thumb:

toms 23. Jun 2005 16:35

Re: Fenster-Icon aus hWnd ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

Marphy 23. Jun 2005 17:19

Re: Fenster-Icon aus hWnd ermitteln
 
Hi Toms,
hat dir das Edit-Menü so gefallen? :wink:

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

Gruß, Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr.
Seite 3 von 4     123 4      

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