![]() |
Fenster-Icon aus hWnd ermitteln
Hallo zusammen,
kaum ist das eine Problem gelöst, gibt's schon wieder ein neues... :? Gegeben ist ein Fenster-Handle (mal wieder eines "echten" Fensters, also keines Controls o.ä.). Gesucht das Fenster-Icon, welches in dessen TitleBar angezeigt wird, und zwar in den Größen 32x32 und 16x16 Pixeln. Könnt ihr mir weiterhelfen? Die WNDCLASSEX hat ja entsprechende Einträge, kann man diese evtl. mit GetWindowLong() auslesen? Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
Dazu brauchst du nicht das Fenster, sonder die Exe. da sich in der Ressource der Exe das Icon befindet:
![]() |
Re: Fenster-Icon aus hWnd ermitteln
Hallo Luckie,
antworte doch bitte auf meine Frage :( Das Icon der EXE-Datei ermittle ich bereits über ExtractIconEx. Ich will aber zusätzlich noch das Icon des Formulars selbst... Formular-Icon <> EXE-Icon, das weißt du doch. :wink: Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
Vielleicht hilft dir ja nen Handle zum Icon weiter, welches du über SendMessage und WM_GETICON herausfinden könntest.
ciao, Philipp |
Re: Fenster-Icon aus hWnd ermitteln
Hallo Philipp,
Zitat:
Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
ich denk mal es funktioniert nur bei den Fenstern den explizit ein eigenes Icon zugeordnet wurde.
|
Re: Fenster-Icon aus hWnd ermitteln
Hallo,
Zitat:
Ich will nur ein Handle auf das kleine Symbol ermitteln können, welches in der Titelleiste eines Fensters mit dem Handle hWnd angezeigt wird... Ist das so schwer? :stupid: Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
also bei mir gehts ohne problem. Natürlich bekomm ich nur Icons von Fenstern die ein Icon haben. Also von Panels etc. bekomm ich kein Icon aber von anderen Fenstern schon...
Delphi-Quellcode:
allerdings sollte man dabei beachten das die Abfrage von ICON_BIG 0 sein kann aber von ICON_SMALL2 hingegen ein gültiges handle hat. Also am besten wenn beim ersten aufruf nix zurück kommt noch die anderen icongrößen abfragen in der Hoffnung das dafür ein Handle hinterlegt ist.
LIconHandle := SendMessage(TheWindowHandle, WM_GETICON, ICON_BIG, 0);
if LIconHandle = 0 then ImgIcon.Picture.Graphic := nil else begin LIcon := TIcon.Create; LIcon.Handle := LIconHandle; ImgIcon.Picture.Graphic := LIcon; LIcon.Free; end; |
Re: Fenster-Icon aus hWnd ermitteln
Hello Sir,
Zitat:
Sieht das bei dir anders aus? :gruebel: Danke für deine Postings trotzdem, :mrgreen: Marco |
Re: Fenster-Icon aus hWnd ermitteln
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,
scheint ja wirklich ne harte Nuss zu sein, mein Problem.... :x Zum Austesten der Problematik habe ich (mal wieder) ein kleines Demo-Projekt geschrieben. Ladet es euch einfach aus dem Anhang runter, schaut es euch an und postet eure Erfahrungen/Tipps :-D Danke! :thumb: Grüße, Marco |
Re: Fenster-Icon aus hWnd ermitteln
Keine Idee :?: Hab ich doch extra eine Demo geschrieben :cry: :wink:
Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
Probier mal mein WinSpy aus. Der sollte die Icons (Gross, Klein) anzeigen.
Kann dann auch gerne die Funktion liefern. |
Re: Fenster-Icon aus hWnd ermitteln
Hallo Toms,
Zitat:
Zitat:
Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
und noch besser als per pn wäre hier in dem Thread damit alles was davon haben. Mir geht es hauptsächlich um die Iconroutine...
|
Re: Fenster-Icon aus hWnd ermitteln
Zitat:
Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
hmm, dann würd ich mich freuen wenns wenigstens per pn mal vorbeiflattert...
|
Re: Fenster-Icon aus hWnd ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Der Code steht in der Anlage zur Verfuegung...
|
Re: Fenster-Icon aus hWnd ermitteln
naja, in dem programm wird es ja mit
Delphi-Quellcode:
bzw.
GetClassLong(TheHandle, GCL_HICONSM);
Delphi-Quellcode:
gelöst. Und ein Icon gibts da auch nur von den Fenstern wo auch WM_GetIcon wirkung zeigt.
GetClassLong(TheHandle, GCL_HICON);
|
Re: Fenster-Icon aus hWnd ermitteln
Habe den Code nochmals upgedated. Hatte etwas vergessen.
Zeigt's nun fuer alle Fenster ein Icon an. Falls nein, bei welchen nicht? |
Re: Fenster-Icon aus hWnd ermitteln
im Kontext dieses Programmes zeigt dein Programm bei mir alle Icons an. Aber wenn ich den Teil zum auslesen des Iconhandles anderweitig verwende komme ich zum beispiel nicht an alle icons von Fenstern ran die nicht in der Taskleiste angezeigt werden (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)
|
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 |
Re: Fenster-Icon aus hWnd ermitteln
Zitat:
|
Re: Fenster-Icon aus hWnd ermitteln
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,
ich habe unser Projekt nun nochmals überarbeitet. Nun werden auch bei Visual Basic-Anwendungen die 16x16-Icons korrekt ermittelt... :-D (Ich berichtete, dass bei manchen Anwendungen für das kleine Icon das 32x32-Icon verwendet und nur entsprechend zugeschnitten wurde - dies beschränkt sich meines Testens nach aber wie gesagt zum Glück nur auf VB-Programme. Falls ihr andere Infos habt: posten! :wink:) Es wäre schön, wenn möglichst viele von euch das Projekt einmal testen würden und uns ihre "Erfahrungen" mitteilen! :thumb: Gruß und Dank, Marco |
Re: Fenster-Icon aus hWnd ermitteln
Hallo zusammen,
noch ein kleines Update nachgereicht... :oops: Der aktuelle Code befindet sich im Anhang des vorherigen Posts. Gruß, Marco |
Re: Fenster-Icon aus hWnd ermitteln
Danke für die Ueberarbeitung des Codes.
Zitat:
Titelleiste dargestellt wird?!? Dir Frage bleibt also weiterhin, wie man an's kleine Icon bei VB-Anwendungen kommt. |
Re: Fenster-Icon aus hWnd ermitteln
Hallo toms, hallo DP,
Zitat:
Zitat:
Hmmm... :coder2: Vielleicht sollten wir ja mal Bill Gates auf den Thread aufmerksam machen. :mrgreen: Zitat:
Gruß, Marco |
AW: Fenster-Icon aus hWnd ermitteln
Hallo Ihr beiden,
vielen Dank für die Wunderbare procedure, die mir gerade sehr das Leben erleichtert hat! Grüße leosok |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:21 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