Code: Alles auswählen
file$="C:\ProgramData\Microsoft\Windows\Start Menu\"
Procedure.s GetLinkIcon(ShellLink.s, *nr)
;LinkFile.s=Str(Len(ShellLink)*2)
;MultiByteToWideChar_(#CP_ACP, 0, ShellLink, -1, @LinkFile, Len(ShellLink)) ;We need a WideChar version of the ShellLink.s
Buf.s = Space(1024)
Hotkey.w = 0
Result = 0
CoInitialize_(0)
If CoCreateInstance_(?CLSID_ShellLink,0,1,?IID_IShellLink,@psl.IShellLinkA) >= 0
If psl\QueryInterface(?IID_IPersistFile, @ppf.IPersistFile) >= 0
If ppf\Load(shelllink,0) >= 0 ;Icon loaded?
;Get the icon file and the icon index
psl\GetIconLocation(@Buf, 1024, *nr)
If buf=""
psl\GetPath(Buf, 1024, 0, 4)
EndIf
EndIf
ppf\Release()
EndIf
psl\Release()
EndIf
CoUninitialize_()
ProcedureReturn buf
DataSection
CLSID_ShellLink:
; 00021401-0000-0000-C000-000000000046
Data.l $00021401
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
IID_IShellLink:
; DEFINE_SHLGUID(IID_IShellLinkA, 0x000214EEL, 0, 0)
; C000-000000000046
Data.l $000214EE
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
IID_IPersistFile:
; 0000010b-0000-0000-C000-000000000046
Data.l $0000010b
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
EndDataSection
EndProcedure
Procedure LoadIcon(File$,b.l=0)
If b=0
ProcedureReturn ExtractAssociatedIcon_(GetModuleHandle_(0),file$,@b)
Else
ProcedureReturn ExtractIcon_(GetModuleHandle_(0),file$,b)
EndIf
EndProcedure
Procedure FreeIcon(icon)
ProcedureReturn DestroyIcon_(hIcon)
EndProcedure
Structure IconListe
name.s
icon.i
EndStructure
NewList Dateien.iconliste()
Global menu_entry=0
Procedure.s FilePart(a$)
ProcedureReturn Left(a$,Len(a$)-FindString(ReverseString(a$),".",0))
EndProcedure
Procedure ScanDir(List Dateien.iconListe(),pfad$)
dir=ExamineDirectory(#PB_Any,pfad$,"*.*")
While NextDirectoryEntry(dir)
file$=DirectoryEntryName(dir)
;Debug file$
If DirectoryEntryType(dir)=#PB_DirectoryEntry_Directory
If file$<>"." And file$<>".."
OpenSubMenu(file$)
scandir(dateien(),pfad$+file$+"\")
CloseSubMenu()
EndIf
EndIf
Wend
dir=ExamineDirectory(#PB_Any,pfad$,"*.*")
While NextDirectoryEntry(dir)
file$=DirectoryEntryName(dir)
;Debug file$
If DirectoryEntryType(dir)=#PB_DirectoryEntry_File And LCase(file$)<>"desktop.ini"
AddElement(dateien())
dateien()\name=pfad$+file$
;Debug file$
If UCase(GetExtensionPart(file$))="LNK"
icon$=GetLinkIcon(pfad$+file$,@a.l)
dateien()\icon=loadicon(icon$,a)
If dateien()\icon=0
Debug "fehler:"+file$
EndIf
ElseIf UCase(GetExtensionPart(file$))="URL"
icon$="":iconnr=0
If ReadFile(1,pfad$+file$)
While Not Eof(1)
a$=ReadString(1)
;Debug a$
Select UCase(StringField(a$,1,"="))
Case "ICONFILE":icon$=StringField(a$,2,"=")
Case "ICONINDEX":iconnr=Val(StringField(a$,2,"="))
EndSelect
Wend
CloseFile(1)
EndIf
If icon$
dateien()\icon=loadicon(icon$,iconnr)
Else
dateien()\icon=loadicon(pfad$+file$)
EndIf
Else
dateien()\icon=loadicon(pfad$+file$)
EndIf
MenuItem(menu_entry,filepart(file$),dateien()\icon)
menu_entry+1
EndIf
Wend
EndProcedure
CreatePopupImageMenu(0)
scandir(dateien(),file$)
OpenWindow(0,0,0,100,100,"test",#PB_Window_SystemMenu)
DisplayPopupMenu(0,WindowID(0))
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
ForEach dateien()
freeicon(dateien()\icon)
Next