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 }
}