Что нового

Файловая система Получить ассоциативную иконку большого размера

musicstashall

Знающий
Сообщения
322
Репутация
7
Хочу отобразить ассоциативную с файлом или папкой иконку, подобно функции _WinAPI_ShellExtractAssociatedIcon, но с большим размером, например 96. Данная функция работает прям как мне надо, но иконку дает максимум 32. Есть ли альтернативные способы получить иконку, имея путь к файлу/папке?
Сообщение автоматически объединено:

Все получилось. Две расширенные функции:
Код:
Global Const $SHIL_LARGE      = 0x0 ; 32x32 pixels
Global Const $SHIL_SMALL      = 0x1 ; 16x16 pixels
Global Const $SHIL_EXTRALARGE = 0x2 ; 48x48 pixels
Global Const $SHIL_SYSSMALL   = 0x3 ; GetSystemMetrics for SM_CXSMICON and SM_CYSMICON
Global Const $SHIL_JUMBO      = 0x4 ; 256x256 pixels, Vista+

Global Const $SH_16  = 16
Global Const $SH_32  = 32
Global Const $SH_48  = 48
Global Const $SH_64  = 64
Global Const $SH_96  = 96
Global Const $SH_128 = 128
Global Const $SH_160 = 160
Global Const $SH_192 = 192
Global Const $SH_224 = 224
Global Const $SH_256 = 256

Func _WinAPI_ShellGetImageListEx($SHIL_TYPE = $SHIL_JUMBO)
    Local $aRet = DllCall( "shell32.dll", "uint", "SHGetImageList", "int", $SHIL_TYPE, "ptr", DllStructGetPtr(_WinAPI_GUIDFromString("{46EB5926-582E-4017-9FDF-E8998DAA0950}")), "ptr*", 0 )
    If @error Then Return SetError(@error,@extended,0)
    If $aRet[0] Then Return SetError($aRet[0],0,0)
    Return $aRet[3]
EndFunc

Func _WinAPI_ShellExtractAssociatedIconEx($sFilePath, $iIconSize)
    Local $SHIL_TYPE, $iFlags = 0x00000100
    If Not _WinAPI_PathIsDirectory($sFilePath) Then $iFlags = BitOR($iFlags, 0x00000010)
    Local $tSHFILEINFO = DllStructCreate($tagSHFILEINFO)
    If Not _WinAPI_ShellGetFileInfo($sFilePath, $iFlags, 0, $tSHFILEINFO) Then Return SetError(@error + 10, @extended, 0)
 
    Switch $iIconSize
        Case 16
            $SHIL_TYPE = $SHIL_SMALL
        Case 32
            $SHIL_TYPE = $SHIL_LARGE
        Case 48
            $SHIL_TYPE = $SHIL_EXTRALARGE
        Case 64 To 256
            $SHIL_TYPE = $SHIL_JUMBO
    EndSwitch
 
    Local $hIml1 = _WinAPI_ShellGetImageListEx($SHIL_TYPE)
    If @error Then Return SetError(@error,@extended,0)
    If $iIconSize < 64 Or $iIconSize = 256 Then Return _GUIImageList_GetIcon($hIml1, $tSHFILEINFO.iIcon)
    Local $hIml2 = _GUIImageList_Create($iIconSize, $iIconSize, 5, 1)
   
    Local $hIcon = _GUIImageList_GetIcon($hIml2, _GUIImageList_ReplaceIcon($hIml2, -1, _GUIImageList_GetIcon($hIml1, $tSHFILEINFO.iIcon)))
    _GUIImageList_Destroy($hIml1)
    Return $hIcon
 
EndFunc
 
Последнее редактирование:
Верх