Icon aus EXE

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Icon aus EXE

Beitrag von purebas »

Wie kann ich ein Icon aus eine EXE extrahieren und in eine Liste einfügen?
Und wie funktioniert dass mit Dateien, wo die Symbole ja nur indirekt über
die verknüpfte Anwendung zugewiesen werden?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Icon aus EXE

Beitrag von RSBasic »

Mit dem WinAPI-Befehl ExtractIcon(Ex) kannst du das Icon aus einer Executable-Datei oder DLL-Datei extrahieren: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Beispielcode aus der WinAPI Library:

Code: Alles auswählen

EnableExplicit

Define FolderIcon
Define Draw

ExtractIconEx_("shell32.dll",3,0,@FolderIcon, 1)

CreateImage(1,32,32)
Draw = StartDrawing(ImageOutput(1))
  Box(0,0,32,32,RGB(255,255,255))
  DrawIcon_(Draw,0,0,FolderIcon)
StopDrawing()

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(1,10,10,0,0,ImageID(1),0)
  
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Icon aus EXE

Beitrag von ts-soft »

Farbe wäre: Box(0,0,32,32,GetSysColor_(#COLOR_BTNFACE)) die bessere Wahl.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Icon aus EXE

Beitrag von Rudi »

Zum zweiten Teil der Frage:

Code: Alles auswählen

EnableExplicit

Procedure.l CatchExeIcon(Pfad.s)
  Protected Icon.SHFILEINFO
  SHGetFileInfo_(Pfad, #Null, @Icon, SizeOf(SHFILEINFO), #SHGFI_ICON|#SHGFI_SMALLICON|#SHGFI_USEFILEATTRIBUTES)
  ProcedureReturn Icon\hIcon
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ImageGadget(1,10,10,0,0,CatchExeIcon("C:\Autoexec.bat"),0)
 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
purebas
Beiträge: 127
Registriert: 11.03.2008 23:59
Wohnort: München

Re: Icon aus EXE

Beitrag von purebas »

Vielen Dank für die Beispiele.

Unter Win7 wirkt das Icon aus shell32.dll abgeschnitten (siehe Antwort zu 1.Frage).
Sind die Symbole unter Win7 etwas größer als 32 Pixel?
Kann oder sollte man die Größe vom Symbol ermitteln, bevor es extrahiert wird?
Wenn ja, wie macht man das?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Icon aus EXE

Beitrag von ts-soft »

Nein, aber der Rand vom Style klaut Dir ca. 4 pixel. Die solltest Du mit ranbasteln.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Icon aus EXE

Beitrag von Bisonte »

Da ich mich auch grad damit beschäftigen muss ;) ....
purebas hat geschrieben:Kann oder sollte man die Größe vom Symbol ermitteln, bevor es extrahiert wird?
Wenn ja, wie macht man das?
Also vor dem extrahieren geht es nicht...

Allerdings ist in der Prozedur von sibru alles drin um die Abmessungen zu ermitteln, sobald man das Iconhandle hat.

Aber du kannst das #SHGFI_SMALLICON in ein #SHGFI_LARGEICON ändern, aber ob sich an den Maßen irgendetwas tut,
kann ich so nicht sagen. (nachzulesen unter MSDN)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten