Standard-Icon ermitteln *gelöst*

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Standard-Icon ermitteln *gelöst*

Beitrag von Regenduft »

Challö miteinander,

es geht um WinAPI. Wie finde ich heraus, was für ein Icon mit einem Dateityp verknüpft ist? Bei ".txt" ist das ja z.B. standrdgemäß das Notitzblock-Icon.

Ich bin mir sicher, dass das hier irgendwo im Board schon einmal vorkam, habe es aber echt nichtmehr gefunden. In der MS Doku habe ich leider auch nichts gefunden. Bin ich mal wieder blind?
Zuletzt geändert von Regenduft am 29.03.2009 12:20, insgesamt 1-mal geändert.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Aus dem Archiv, plus beispiel

Code: Alles auswählen


Structure MySHFILEINFO 
  hIcon.l 
  iIcon.l 
  dwAttributes.l 
  szDisplayName.b[#MAX_PATH] 
  szTypeName.b[80] 
EndStructure 
Procedure.l GetExtensionIcon(DateiPfad$, Size=0, Index=0) 
 Protected Info.MySHFILEINFO, StandardIcon.l, Flags.l, Typ$ 
 StandardIcon = 0 
 Flags = #SHGFI_ICON
 If Size = 0 
  Flags | #SHGFI_SMALLICON
 Else 
  Flags | #SHGFI_LARGEICON 
 EndIf 
 If Right(DateiPfad$,1) <> "\" : Left(DateiPfad$,Len(DateiPfad$)-1) : EndIf
 Typ$ = GetExtensionPart(DateiPfad$)
 If Typ$ 
  Flags | #SHGFI_USEFILEATTRIBUTES	
 EndIf
 If SHGetFileInfo_(DateiPfad$, 0, @Info.MySHFILEINFO, SizeOf(MySHFILEINFO), Flags) 
  StandardIcon = Info\hIcon 
 Else 
  If Size = 0 
   ExtractIconEx_("shell32.dll", Index, 0, @StandardIcon, 1) 
  Else 
   ExtractIconEx_("shell32.dll", Index, @StandardIcon, 0, 1) 
  EndIf 
 EndIf 
 ProcedureReturn StandardIcon 
EndProcedure

OpenWindow(0, 0, 0, 100, 100, "Fenster", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
 CreateGadgetList(WindowID(0))
  StringGadget(1,0,0,100,20,".txt")
  ImageGadget(2,17,27,64,64, 0)
  SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))
 
 Repeat
  Event = WaitWindowEvent()
  Select Event
   Case #PB_Event_CloseWindow
    End
   Case #PB_Event_Gadget
    Select EventGadget()
     Case 1
      SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))
    EndSelect
  EndSelect
 ForEver

einfach eine Dateiendung eingeben und gucken ^^ zB.
.exe
.txt
.doc
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

ja, das CodeArchiv hat ganz schön was drauf!

Witzige Sache mit den Icons, auch meine selbst definierten sind dabei :)
Win11 x64 | PB 6.20
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Beitrag von Regenduft »

Danke Stargate! Genau was ich gesucht habe! :allright:
EDIT: Beinhaltet sogar mehr als ich ursprünglich dachte zu benötigen, da es auch Leufwerk-Icons korrekt ermittelt!

Natürlich ärgert es mich jetzt weil ich a) es im Archiv nicht gefunden habe und b) weil ich SHGetFileInfo_() eigentlich kenne und selbst hätte drauf kommen können. >_<

Bin also nicht nur blind sondern auch blöd! :lol:

Muss mal noch kurz erwähnen: Bin jetzt genau ein Jahr und 3 Tage im Board, aber bin immerwieder von den schnellen, freundlichen und treffenden Antworten der Mitglieder begeistert!!!einself
:allright: :praise:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Muss mal noch kurz erwähnen: Bin jetzt genau ein Jahr und 3 Tage im Board, aber bin immerwieder von den schnellen, freundlichen und treffenden Antworten der Mitglieder begeistert!!!einself
Bin 9 Monate und ein paar zerquetschte Tage im Forum und für mich trifft
das selbe zu :allright:
Win11 x64 | PB 6.20
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Beitrag von Regenduft »

(Das würde wohl jetzt eher in Anfänger gehören, 'n neuer Thread wäre aber wohl noch blöder.)

Was soll denn diese Zeile bringen? Die macht doch effektiv überhaupt nix, selbst wenn die If-Bedingung erfüllt ist!

Code: Alles auswählen

if Right(DateiPfad$,1) <> "\" : Left(DateiPfad$,Len(DateiPfad$)-1) : EndIf
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
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

Beitrag von ts-soft »

Da hat jemand gleiches mit ungleichem verwechselt :mrgreen:
Hier mal der Code etwas aktueller:

Code: Alles auswählen

Procedure GetExtensionIcon(DateiPfad$, Size=0, Index=0)
  Protected Info.SHFILEINFO, StandardIcon, Flags, Typ$

  Flags = #SHGFI_ICON
  If Size = 0
    Flags | #SHGFI_SMALLICON
  Else
    Flags | #SHGFI_LARGEICON
  EndIf
  If Right(DateiPfad$,1) = "\" : Left(DateiPfad$,Len(DateiPfad$)-1) : EndIf
  Typ$ = GetExtensionPart(DateiPfad$)
  If Typ$
    Flags | #SHGFI_USEFILEATTRIBUTES
  EndIf
  If SHGetFileInfo_(DateiPfad$, 0, @Info.SHFILEINFO, SizeOf(SHFILEINFO), Flags)
    StandardIcon = Info\hIcon
  Else
    If Size = 0
      ExtractIconEx_("shell32.dll", Index, 0, @StandardIcon, 1)
    Else
      ExtractIconEx_("shell32.dll", Index, @StandardIcon, 0, 1)
    EndIf
  EndIf
  ProcedureReturn StandardIcon
EndProcedure

OpenWindow(0, 0, 0, 100, 100, "Fenster", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
StringGadget(1,0,0,100,20,".txt")
ImageGadget(2,17,27,64,64, 0)
SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          SetGadgetState(2, GetExtensionIcon(GetGadgetText(1), 0))
      EndSelect
  EndSelect
ForEver
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
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

das ding macht immer noch kein sinn, weil das ergebnis von
Left(DateiPfad$,Len(DateiPfad$)-1)
garnicht in DateiPfad$ geschrieben wird, deswegen hatte ich den fehler nie bemerkt ...
echt peinlich ...

einfach die ganze Zeile weg oder so:

Code: Alles auswählen

If Right(DateiPfad$,1) = "\"
 DateiPfad$ = Left(DateiPfad$,Len(DateiPfad$)-1)
EndIf 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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

Beitrag von ts-soft »

hab ich einen Fehler zwar beseitigt, aber es war trotzdem sinnlos :mrgreen:
lieber überprüfen obs eine extension gibt, weil ein pfad mit backslash am
ende wird keine datei mit gültiger extension enthalten :mrgreen:

Was da so alles im CodeArchiv für Leichen schlummern :lol:
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
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Beitrag von Regenduft »

Danke ts-soft und Stargate!
Ich hatte schon angefangen an meinem Grundwissen zu zweifeln! :lol:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten