Delphi-PRAXiS

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)

Marphy 10. Jun 2005 21:17


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

Luckie 10. Jun 2005 21:22

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: Hier im Forum suchenSHGetFileInfo

Marphy 10. Jun 2005 21:36

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

c113plpbr 10. Jun 2005 21:48

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

Marphy 12. Jun 2005 14:19

Re: Fenster-Icon aus hWnd ermitteln
 
Hallo Philipp,
Zitat:

Zitat von c113plpbr
Vielleicht hilft dir ja nen Handle zum Icon weiter, welches du über SendMessage und WM_GETICON herausfinden könntest.

hab das nun implementiert, funktioniert aber leider nur bei einigen wenigen Fenstern...

Gruß, Marco

SirThornberry 12. Jun 2005 14:22

Re: Fenster-Icon aus hWnd ermitteln
 
ich denk mal es funktioniert nur bei den Fenstern den explizit ein eigenes Icon zugeordnet wurde.

Marphy 12. Jun 2005 18:06

Re: Fenster-Icon aus hWnd ermitteln
 
Hallo,

Zitat:

Zitat von SirThornberry
ich denk mal es funktioniert nur bei den Fenstern den explizit ein eigenes Icon zugeordnet wurde.

:? Ich werde es doch noch hinbekommen, Titelleisten ohne und mit Icons auseinanderzuhalten?!

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

SirThornberry 12. Jun 2005 19:10

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

Marphy 13. Jun 2005 16:29

Re: Fenster-Icon aus hWnd ermitteln
 
Hello Sir,

Zitat:

Zitat von SirThornberry
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.

ICON_SMALL2 ist nur auf Windows XP verfügbar. Beim Quellcodefenster der Delphi-IDE z.B. wird ein ICON_BIG ermittelt, ICON_SMALL aber nicht. Bei anderen Programmen (z.B. der Windows Editor) wird kein Icon - weder BIG noch SMALL - zurückgeliefert.
Sieht das bei dir anders aus? :gruebel:

Danke für deine Postings trotzdem, :mrgreen:
Marco

Marphy 14. Jun 2005 19:38

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

Marphy 16. Jun 2005 15:13

Re: Fenster-Icon aus hWnd ermitteln
 
Keine Idee :?: Hab ich doch extra eine Demo geschrieben :cry: :wink:

Gruß, Marco

toms 16. Jun 2005 17:08

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.

Marphy 16. Jun 2005 20:21

Re: Fenster-Icon aus hWnd ermitteln
 
Hallo Toms,

Zitat:

Zitat von toms
Probier mal mein WinSpy aus. Der sollte die Icons (Gross, Klein) anzeigen.

Tolles Programm! :thumb: Ein kleiner Hinweis noch unter uns: die Höhe der ListView-Einträge wird nicht angepasst, sodass die Fenster-Icons z.T. abgeschnitten werden. Aber dein Programm ist ja noch in der Beta-Phase... (nur ein nett gemeinter Hinweis, kein :roll: o.ä.!)

Zitat:

Zitat von toms
Kann dann auch gerne die Funktion liefern.

Danke für das Angebot, das wäre super! Schick mir einfach eine PN. :hello:

Gruß, Marco

SirThornberry 16. Jun 2005 20:46

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

Marphy 17. Jun 2005 12:52

Re: Fenster-Icon aus hWnd ermitteln
 
Zitat:

Zitat von SirThornberry
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...

Ahh, du liest also doch noch mit... :mrgreen: Gern, mir soll's recht sein - ich weiß nur nicht, ob Toms das so gut findet.... :???:

Gruß, Marco

SirThornberry 17. Jun 2005 17:11

Re: Fenster-Icon aus hWnd ermitteln
 
hmm, dann würd ich mich freuen wenns wenigstens per pn mal vorbeiflattert...

toms 17. Jun 2005 17:44

Re: Fenster-Icon aus hWnd ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Code steht in der Anlage zur Verfuegung...

SirThornberry 17. Jun 2005 17:58

Re: Fenster-Icon aus hWnd ermitteln
 
naja, in dem programm wird es ja mit
Delphi-Quellcode:
GetClassLong(TheHandle, GCL_HICONSM);
bzw.
Delphi-Quellcode:
GetClassLong(TheHandle, GCL_HICON);
gelöst. Und ein Icon gibts da auch nur von den Fenstern wo auch WM_GetIcon wirkung zeigt.

toms 17. Jun 2005 18:17

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?

SirThornberry 17. Jun 2005 20:21

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)

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

toms 23. Jun 2005 23:29

Re: Fenster-Icon aus hWnd ermitteln
 
Zitat:

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

Gruß, Marco

So, jetzt sollten alle units in der Zip Datei sein.

Marphy 30. Jun 2005 20:26

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

Marphy 1. Jul 2005 15:05

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

toms 4. Jul 2005 13:22

Re: Fenster-Icon aus hWnd ermitteln
 
Danke für die Ueberarbeitung des Codes.

Zitat:

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
Genau das habe ich auch festgestellt. Aber das kleine Icon sollte doch existieren, zumal es doch in der
Titelleiste dargestellt wird?!?
Dir Frage bleibt also weiterhin, wie man an's kleine Icon bei VB-Anwendungen kommt.

Marphy 4. Jul 2005 16:26

Re: Fenster-Icon aus hWnd ermitteln
 
Hallo toms, hallo DP,

Zitat:

Zitat von toms
Danke für die Ueberarbeitung des Codes.

Hey hey, nichts zu danken! Ich habe ja nicht speziell dir, sondern uns beiden (und vielleicht auch noch ein paar Mitlesern)geholfen (von letzteren wäre es sehr nett, sich auch mal kurz zu melden, falls sie sich das Projekt runtergeladen haben... :zwinker:) - es ist ja unser gemeinsames Projekt :???: :wink:

Zitat:

Zitat von toms
Genau das habe ich auch festgestellt. Aber das kleine Icon sollte doch existieren, zumal es doch in der Titelleiste dargestellt wird?!?

Ja, die Sache ist schon ein bisschen komisch... Das Icon ist ja sicher auch nur mit DrawIcon() auf die Titelleiste gepinselt, aber Windows selbst muss das Ding ja auch irgendwo herbekommen. :gruebel:
Hmmm... :coder2: Vielleicht sollten wir ja mal Bill Gates auf den Thread aufmerksam machen. :mrgreen:

Zitat:

Zitat von toms
Dir Frage bleibt also weiterhin, wie man an's kleine Icon bei VB-Anwendungen kommt.

Ein VB-Programm besteht immer aus mindestens zwei Fenstern, und zwar einem unsichtbaren der Klasse "ThunderRT5Main" und einem sichtbaren, "ThunderRT5Form". Vom unsichtbaren Fenster kann ein Icon ermittelt werden, beim sichbaren scheitert es.... Deswegen meine entsprechende Implementierung. :???:

Gruß, Marco

leosok 17. Mär 2011 01:19

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 11:51 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