Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Vom Form Handle zum Icon (https://www.delphipraxis.net/76019-vom-form-handle-zum-icon.html)

backdraft 28. Aug 2006 21:00


Vom Form Handle zum Icon
 
Hallo,

welche Möglichkeit habe ich, wenn ich das Fenster Handle habe, mir das Icon des Fensters in ein TBitmap zu kopieren?

Danke Oliver

DGL-luke 28. Aug 2006 21:03

Re: Vom Form Handle zum Icon
 
Du kommst vom fensterhandle zum prozesshandle, von dem zum modulnamen und damit zum pfad der exe. und aus der kannst du die icons auslesen.

Geht alles mit WinAPI-Funktionen - Frag mich aber nicht, wie die heissen.

backdraft 28. Aug 2006 21:05

Re: Vom Form Handle zum Icon
 
Zitat:

Zitat von DGL-luke
Du kommst vom fensterhandle zum prozesshandle, von dem zum modulnamen und damit zum pfad der exe. und aus der kannst du die icons auslesen.

Geht alles mit WinAPI-Funktionen - Frag mich aber nicht, wie die heissen.

nicht das Programm Icon, sondern das Icon vom Fenster

idontwantaname 28. Aug 2006 21:09

Re: Vom Form Handle zum Icon
 
ich weiß zwar nicht obs hilft, aber schau dir mal das hier an:
http://msdn.microsoft.com/library/en...eving_property

backdraft 28. Aug 2006 21:18

Re: Vom Form Handle zum Icon
 
Zitat:

Zitat von idontwantaname
ich weiß zwar nicht obs hilft, aber schau dir mal das hier an:
http://msdn.microsoft.com/library/en...eving_property

Also hab spontan mal
Delphi-Quellcode:
vbitmap.Handle := GetProp(AHandle, 'PROP_ICON');
probiert, liefert aber leider als Handle 0 zurück.

DGL-luke 28. Aug 2006 21:19

Re: Vom Form Handle zum Icon
 
@backdraft: Ich meinte auch das Icon vom Fenster...

backdraft 28. Aug 2006 21:21

Re: Vom Form Handle zum Icon
 
Zitat:

Zitat von DGL-luke
@backdraft: Ich meinte auch das Icon vom Fenster...

woher weiss ich welches fenster in der exe?
ich muss doch auch irgendwie rankommen, wenn das prog läuft

backdraft 28. Aug 2006 21:32

Re: Vom Form Handle zum Icon
 
Habs gefunden, es geht mit:

vIcon := SendMessage(AHandle, WM_GETICON, ICON_SMALL, 0);

oder

vIcon := SendMessage(AHandle, WM_GETICON, ICON_BIG, 0);

von da aus gehts ja leicht zum Bitmap.

Danke trotzdem

ghost007 15. Mai 2007 17:32

Re: Vom Form Handle zum Icon
 
mal ne blöde frage ... :oops:
wie komm ich dann weiter zum bitmap? weil des sendmessage liefert mir doch nur 'nen ... integer?

MfG - Ghost007

DGL-luke 15. Mai 2007 17:40

Re: Vom Form Handle zum Icon
 
Wenn mich nicht alles täuscht, bekommst du das Handle.

Delphi-Quellcode:
with TBitmap.Create do
begin
  Handle := vIcon;
  ...

  Free;
end;

ghost007 15. Mai 2007 18:15

Re: Vom Form Handle zum Icon
 
menno, ich verstehs nicht :(
habs wie folgt versucht:

Delphi-Quellcode:
var
  bitmap : TBitmap;
begin
 bitmap.Handle:= SendMessage(AHandle, WM_GETICON, ICON_BIG, 0);
 ImageList1.Add(bitmap,bitmap);
 bitmap.Free;
end;
aber es geht nicht, bekomm immer ne AC. ...
AHandle muss schon das handle eines fensters sein, oder?

MfG - Ghost007

//Edit:
oder wie kann ich mit dem code von luke, die erstellte bitmap in ein image laden bzw. in einer imagelist speichern?

MfG - Ghost007

CCRDude 15. Mai 2007 18:48

Re: Vom Form Handle zum Icon
 
Ein Icon-Handle an ein TBitmap zuweisen?
Ich würd erstmal TIcon nehmen ;)

ghost007 15. Mai 2007 19:01

Re: Vom Form Handle zum Icon
 
also,
ich verwende folgenden code um alle geöffneten programme und deren titel auszulesen.
Der code funktioniert auch gut, aber das mit dem icon auslesen bekomm ich nicht hin ... bekomm ständig ne access violation ... :(

Delphi-Quellcode:
function EnumWin(hWnd: THandle; FirstWnd: PCardinal): Boolean; stdcall;
var
  WinText: AnsiString;
  ProcId : cardinal;
  icon : Ticon;
begin
  Result := True;
  if IsWindowVisible(hwnd) then
  begin
    if (GetWindowLong(hwnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) <> 0 then
      hwnd:= GetWindowLong(hWnd, GWL_HWNDPARENT);
    ProcId := GetWindowThreadProcessID(hWnd, nil);
    SetLength(WinText, SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0));
    SendMessage(hWnd, WM_GETTEXT, Length(WinText) + 1, integer(WinText));
    if (length(WinText) > 0) and (FirstWnd^ <> ProcId) then
     begin
      Form1.ListBox1.Items.Add(WinText);
      icon.Handle:=SendMessage(hWnd, WM_GETICON, ICON_BIG, 0);
      Form1.ImageList1.AddIcon(icon);
      icon.Free;
     end;
   FirstWnd^ := ProcId;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FirstWnd : cardinal;
begin
  ListBox1.Clear;
  EnumWindows(@EnumWin, cardinal(@FirstWnd));
end;
MfG - Ghost007

P.S.Help me :wall:

halinchen 15. Mai 2007 19:02

Re: Vom Form Handle zum Icon
 
Hast du nicht ein
Delphi-Quellcode:
Icon := TIcon.Create
vergessen?

[edit]Ich kriegs nämlich auch nicht hin. Als Bitmap ist es 0x0 Pixel groß und als Icon kommt danach immer ein Fehler ("ungültiges Symbol")
Ich benötige das nämlich auch gerade :-D [edit]

ghost007 15. Mai 2007 19:12

Re: Vom Form Handle zum Icon
 
omg ich n*** ^^ stimmt, mit icon := TIcon.Create; gehts ...
jetzt sind also die icons in der imagelist.
hab grad schonmal in der onlinehilfe guggt, aber wie komm ich jetzt an die icons? und wie wandel ich se in bitmaps um?

MfG - Ghost007

halinchen 15. Mai 2007 19:15

Re: Vom Form Handle zum Icon
 
Icon in Bitmap umwandeln:
Delphi-Quellcode:
bmp.Assign(NIL); //löschen
bmp.height := ico.height;
bmp.width := ico.width;
bmp.Draw(0,0,ico);
--> ungetestet

Delphi-Quellcode:
bmp.Assign(ico)
geht ja leider nicht.

ghost007 15. Mai 2007 19:42

Re: Vom Form Handle zum Icon
 
Liste der Anhänge anzeigen (Anzahl: 1)
hm,
wie mir grade auffällt, schlägt die abfrage manchmal fehlt, dann liefert die funktion, welche das handle der icons liefern soll, den wert 0, und die bitmap wird weiß ... kann des an dem ICON_BIG bzw. ICON_SMALL liegen?

MfG - Ghost007

[EDIT]
hier der erweiterte code um das letzte ermittelte icon als bitmap darzustellen

Delphi-Quellcode:
function EnumWin(hWnd: THandle; FirstWnd: PCardinal): Boolean; stdcall;
var
  WinText: AnsiString;
  ProcId : cardinal;
  icon : Ticon;
  bmp : Tbitmap;
begin
  Icon := TIcon.Create;
  bmp := TBitmap.Create;
  Result := True;
  if IsWindowVisible(hwnd) then
  begin
    if (GetWindowLong(hwnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) <> 0 then
      hwnd:= GetWindowLong(hWnd, GWL_HWNDPARENT);
    ProcId := GetWindowThreadProcessID(hWnd, nil);
    SetLength(WinText, SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0));
    SendMessage(hWnd, WM_GETTEXT, Length(WinText) + 1, integer(WinText));
    if (length(WinText) > 0) and (FirstWnd^ <> ProcId) then
     begin
      Form1.ListBox1.Items.Add(WinText);
      Form1.handle.Items.Add(IntToStr(hWnd));
      Form1.ListBox2.Items.Add(IntToStr(SendMessage(hWnd, WM_GETICON, ICON_BIG, 0)));
      icon.Handle:=SendMessage(hWnd, WM_GETICON, ICON_BIG, 0);
      if icon.Handle <> 0 then
       begin
        Form1.ImageList1.AddIcon(icon);
        bmp.Assign(NIL); //löschen
        bmp.height := icon.height;
        bmp.width := icon.width;
        bmp.Canvas.Draw(0,0,icon);
        Form1.Image2.Picture.Bitmap:=bmp;
       end;
      icon.Free;
     end;
   FirstWnd^ := ProcId;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FirstWnd : cardinal;
begin
  ListBox1.Clear;
  EnumWindows(@EnumWin, cardinal(@FirstWnd));
end;
Wie kann es nun aber sein, das manche Applicationen als iconhandle 0 zurück liefern?
Ich hab schon getestet, bei den applicationen (z.B. Winamp) ist es egal ob man ICON_BIG oder ICON_SMALL aufruft ...

[/EDIT]
[EDIT]
im anhang sieht man die ausgabe des obigen codes ... wie kann es sein, das ich als icon handle 0 bekomme ... bzw. wie komm ich dann an die icons?
[/EDIT]

bitsetter 15. Mai 2007 20:22

Re: Vom Form Handle zum Icon
 
Hi,

kannst ja mal versuchen ob es so
Delphi-Quellcode:
icon.Handle := SendMessage(hWnd, WM_GETICON, ICON_BIG, 0);
if icon.Handle = 0 then
  icon.Handle := GetClassLong(hWnd, GCL_HICON);
anders ist.

ghost007 15. Mai 2007 20:45

Re: Vom Form Handle zum Icon
 
sehr schön, danke :)
funktioniert perfekt :)

MfG - Ghost007

Mackhack 15. Mai 2007 21:37

Re: Vom Form Handle zum Icon
 
Brauchst du dazu nicht MSDN-Library durchsuchenExtractIcon oder MSDN-Library durchsuchenExtractIconEx??? Du uebergibst der Funktion den Index der Icons die du haben willst und schwupps hast du alle da!

halinchen 16. Mai 2007 13:42

Re: Vom Form Handle zum Icon
 
Zitat:

Zitat von Mackhack
Brauchst du dazu nicht MSDN-Library durchsuchenExtractIcon oder MSDN-Library durchsuchenExtractIconEx??? Du uebergibst der Funktion den Index der Icons die du haben willst und schwupps hast du alle da!

MSDN
The ExtractIcon function retrieves a handle to an icon from the specified executable file, DLL, or icon file.


Klingt für mich, als würde es aus einer Icon-Datei ein TIcon machen. Aber das hat man ja schon.

[edit]Ich möchte mich dann auch bedanken! Klappt prima! :thumb: [/edit]

DGL-luke 16. Mai 2007 14:00

Re: Vom Form Handle zum Icon
 
Wenn man mehrere Icons will, die zum Beispiel in einer DLL gespeichert sind, macht das schon Sinn.

halinchen 16. Mai 2007 14:04

Re: Vom Form Handle zum Icon
 
Zitat:

Zitat von DGL-luke
Wenn man mehrere Icons will, die zum Beispiel in einer DLL gespeichert sind, macht das schon Sinn.

Naja, aber eine DLL ist ja auch eine Datei. Ich meinte das so, dass das Icon ja schon im Speicher ist und man es nicht aus einer Datei extrahieren muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:57 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