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
Последнее редактирование: