![]() |
Re: Fenster-Icon aus hWnd ermitteln
Zitat:
Poste doch mal einen Fenster Screenshot, damit wir auch sicher von denselben Icons sprechen. |
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 ![]() Ü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:
Im Anhang findet ihr zu den einzelnen Punkten Screenshots... Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
Hey Toms, noch da? :(
|
Re: Fenster-Icon aus hWnd ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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; |
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 ![]() Irgendwie muss es doch eine Lösung geben? :wall: Gruß, Marco |
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 |
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; |
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: |
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. |
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 17:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz