1 (изменено: upsi_daezium, 2016-12-09 00:35:05)

Тема: AHK: Получить иконку папки или ассоциированного файла

День добрый.

Как получить иконку у конкретного файла (C:\test.pdf, к примеру) или папки (C:\users\user\desktop, тут в идеале нужна иконка именно десктопа, на худой конец просто иконка папки) и поместить в окно, например, на кнопку.
Я нашел только примеры извлечения иконок из exe, dll.
Есть ли какой-нибудь относительно простой способ или это очень сложно получается.

2

Re: AHK: Получить иконку папки или ассоциированного файла

Для папки см. ключ IconResource вложенного desktop.ini.
Для файлов нужно ковырять HKCR. Смотрим дефолтный ключ в .<ext>, переходим в указанную там ветку, и в нём читаем дефолтный ключ в подветке DefaultIcon.

3

Re: AHK: Получить иконку папки или ассоциированного файла

Flasher спасибо, тоже уже об этом думал, desctop.ini еще смог бы распарсить, а вот в реестр даже не знаю.
Я, кстати, нашел такой код на забугорном:


FilePath = C:\Header.png
h_icon := DllCall("Shell32\ExtractAssociatedIcon" (A_IsUnicode ? "W" : "A"), ptr, DllCall("GetModuleHandle", ptr, 0, ptr), str, FilePath, "ushort*", lpiIcon, ptr)   ;only supports 32x32
Gui, Add, Text, w64 h64 Y0 X48 hwndmypic1 0x3 gMySubroutine, ; 0x3 = SS_ICON
SendMessage, STM_SETICON := 0x0170, h_icon, 0,, Ahk_ID %mypic1%
Gui, Add, Text, w128 h64 Y32 X0 Center gMySubroutine, VPBank- Thu bo nhiem kiem toan 2012
Gui, Show, AutoSize Center
return
MySubroutine:
run, C:\Header.png
Exitapp

Работает, показывает правильную иконку папок и файлов, но, как человек там пишет, можно получить иконку размера 32х32. Я пробовал методом тыка менять, но результата пока нет.

4

Re: AHK: Получить иконку папки или ассоциированного файла

FilePath := A_Desktop

WM_SETICON := 0x80, ICON_BIG := 1, ICON_SMALL := 0
sz := { 16: "SMALL", 32: "LARGE", 48: "EXTRALARGE", 256: "JUMBO" }

Icon1 := GetSysImgListIcon(FilePath, sz[16])
Icon2 := GetSysImgListIcon(FilePath, sz[32])
Icon3 := GetSysImgListIcon(FilePath, sz[48])
Icon4 := GetSysImgListIcon(FilePath, sz[256])

Gui, +LastFound
Gui, Add, Pic, % "w" Icon2.W " h" Icon2.H, % "HICON:" Icon2.HICON
Gui, Add, Pic, % "x+10 yp w" Icon3.W " h" Icon3.H, % "HICON:" Icon3.HICON
Gui, Add, Pic, % "x+10 yp w" Icon4.W " h" Icon4.H, % "HICON:" Icon4.HICON
SendMessage, WM_SETICON, ICON_SMALL, Icon1.HICON  ; иконка в строке заголовка
SendMessage, WM_SETICON, ICON_BIG  , Icon2.HICON  ; иконка для Alt + Tab
Gui, Show
Return

GuiClose:
   ExitApp

GetSysImgListIcon(Path, Size := "SYSSMALL", Overlay := "")  {
   static SHIL := { LARGE: 0x00, SMALL: 0x01, EXTRALARGE: 0x02, SYSSMALL: 0x03, JUMBO: 0x04 }  ; возможные размеры
        , AW := A_IsUnicode ? "W" : "A"
        , cbSFI := A_PtrSize + 8 + (340 << A_IsUnicode)
        , IID_IIL_Str := "{46EB5926-582E-4017-9FDF-E8998DAA0950}"
        , SHGFI := {SYSICONINDEX: 0x4000, PIDL: 0x8}
        , SHGIOI := {SHARE: 0x0FFFFFFF, LINK: 0x0FFFFFFE, SLOWFILE: 0x0FFFFFFD, DEFAULT: 0x0FFFFFFC}
        , ILD_IMAGE := 0x20
   
   VarSetCapacity(IID_IIL, 16, 0) ; IID
   DllCall("Ole32\IIDFromString", WStr, IID_IIL_Str, Ptr, &IID_IIL, UInt)
   
   HMOD := DllCall("GetModuleHandle", Str, "shell32.dll", UPtr)
   FileIconInit := DllCall("GetProcAddress", Ptr, HMOD, Ptr, 660, UPtr)
   DllCall(FileIconInit, UInt, True, UInt)
   
   VarSetCapacity(SFI, cbSFI, 0) ; SHFILEINFO
   DllCall("Shell32\SHParseDisplayName", Str, path, Ptr, 0, PtrP, ppidl, UInt, 0, UIntP, 0)
   Flags := SHGFI.PIDL | SHGFI.SYSICONINDEX
   if !DllCall("Shell32\SHGetFileInfo" . AW, Ptr, ppidl, UInt, 0, Ptr, &SFI, UInt, cbSFI, UInt, Flags, UPtr)
      Return False
   
   IconIndex := NumGet(SFI, A_PtrSize, "Int")
   if DllCall("Shell32\SHGetImageList", Int, SHIL[Size], Ptr, &IID_IIL, PtrP, IIL, UInt)
      Return False
   
   Flags := ILD_IMAGE
   if SHGIOI.HasKey(Overlay)
   && (IOV := DllCall("Shell32\SHGetIconOverlayIndex", Ptr, 0, UInt, SHGIOI[Overlay], Int)) >= 0
      Flags |= IOV << 8
      
   DllCall("Comctl32\ImageList_GetIconSize", Ptr, IIL, IntP, CX, IntP, CY, UInt)
   hIcon := DllCall("Comctl32\ImageList_GetIcon", Ptr, IIL, Int, IconIndex, UInt, Flags, UPtr)
   
   Return { HICON: hIcon, W: CX, H: CY }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder