Skip to content

Instantly share code, notes, and snippets.

@AHK-just-me
Last active December 6, 2024 14:27

Revisions

  1. AHK-just-me revised this gist Apr 18, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion IconEx.ahk
    Original file line number Diff line number Diff line change
    @@ -220,7 +220,7 @@ LVISUB:
    IconD := GetResource(hMod, nID, RT_ICON, nSize, hResData)
    Wi := (W > 64) ? 64 : W
    Hi := (H > 64) ? 64 : H
    hIcon := DllCall("User32.dll\CreateIconFromResourceEx", "Ptr", IconD, "UInt", BPP, "Int", 1
    hIcon := DllCall("User32.dll\CreateIconFromResourceEx", "Ptr", IconD, "UInt", nSize, "Int", 1
    , "UInt", 0x00030000, "Int", Wi, "Int", Hi, "UInt",(LR_SHARED := 0x8000), "UPtr")
    SendMessage, %STM_SETIMAGE%, 0x1, 0, , % "ahk_id " . Icon%A_Index%
    SendMessage, %STM_SETIMAGE%, 0x1, hIcon, , % "ahk_id " . Icon%A_Index%
  2. just me created this gist May 4, 2013.
    457 changes: 457 additions & 0 deletions IconEx.ahk
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,457 @@
    /* _______________________________________________________________________________________
    _____ ______ __ _
    |_ _| | ____| /_ || | _ _ _ SKAN (Suresh Kumar A N)
    | | ___ ___ _ __ | |__ __ __ | || |_| | | | | | arian.suresh@gmail.com
    | | / __/ _ \| '_ \| __| \ \/ / | ||___| | | ' | |
    _| || (_| (_) | | | | |____ > < | | | | | |__| | Created on : 13-May-2008
    |_____\___\___/|_| |_|______/_/\_\ |_|(_) |_| \.___/ Last Modified : 10-Aug-2012
    [ I C O N E X P L O R E R A N D E X T R A C T O R ] Version : 1.4u
    _______________________________________________________________________________________
    */
    #NoEnv
    #SingleInstance, Force
    SetWorkingDir, %A_ScriptDir%
    SetBatchLines, -1
    Process, Priority, , High
    ; ======================================================================================================================
    SaveButton := 0x79 -1 ; (VK code for F9) Note: modify -1 to -2 for F8 and so on...
    KeyName := "F9" ; depends on the VK code you use above
    Deff := A_ScriptDir ; Default ICON save folder
    CallB := RegisterCallback("EnumResNameProc")
    tFolder := A_WinDir . "\System32\shell32.dll" ; default folder in address bar
    AhkVersion := A_AhkVersion . (A_IsUnicode ? (A_PtrSize = 8 ? " (U64)" : " (U32)") : " (ANSI)")
    GuiTitle := "IconEx - v1.4u [ AutoHotkey v" . AhkVersion . " ]"
    RT_GROUP_ICON := 14
    RT_ICON := 3
    STM_SETIMAGE := 0x172
    If FileExist(A_Temp . "\IconEx.tmp") {
    FileRead, tFolder, %A_Temp%\IconEx.tmp
    FileDelete, %A_Temp%\IconEx.tmp
    }
    ; ======================================================================================================================
    Gui, Font, s10 Normal, Tahoma
    Gui, Add, Combobox, x7 y7 w550 h21 Choose1 -Theme hwndhSHAC vtFolder, %tFolder%
    ControlGet, hMyEdit, hWnd,, Edit1, ahk_id %hSHAC%
    ; SHAutoComplete(): Sean - http://www.autohotkey.com/forum/viewtopic.php?p=121621#121621
    ; For constants : http://www.codeproject.com/KB/edit/autocomp.aspx
    DllCall("Shlwapi.dll\SHAutoComplete", "Ptr", hMyEdit, "UInt", 0x1|0x10000000)
    Gui, Font, s8 Normal, Tahoma
    Gui, Add, Button, x+2 w33 h24 +Default gUpdateResourceList, &Go
    Gui, Add, Button, x+2 w52 h24 gSelectFolder, &Browse
    Gui, Add, ListView
    , x7 y+5 h280 w235 -Theme -E0x200 +0x4 +0x8 +Border vLVR gLVR +BackGroundFFFFFA c444466 AltSubmit
    , Resource File|Icons|IconGroup
    LV_ModifyCol(1 ,"170")
    LV_ModifyCol(2, "42 Integer")
    LV_ModifyCol(3, "0")
    Gui, Add, ListView
    , x+0 yp h280 w405 -Theme +Icon -E0x200 +0x100 +BackGroundFFFFFC cBB2222 Border AltSubmit vLVI gLVI hwndLVC2
    Gui, Add, Hotkey, x2 y+79 w1 h1 +Disabled vHotkey gCreateSimpleIcon
    Loop 8 {
    Ix += 1
    Gui, Add, Text, x+10 yp-70 0x1203 w70 h70 vI%Ix% hWndIcon%Ix% gSelectSimpleIcon
    Gui, Add, Text, xp yp+70 0x201 w70 h16 vIconT%Ix%, -
    }
    Gui, Add, Text, x2 y+79 w1 h1
    Loop 8 {
    Ix += 1
    Gui, Add, Text, x+10 yp-70 0x1203 w70 h70 vI%Ix% hWndIcon%Ix% gSelectSimpleIcon
    Gui, Add, Text, xp yp+70 0x201 w70 h16 vIconT%Ix%, -
    }
    Gui, Add, Button, x7 y+30 gAccelerator, &File
    Gui, Add, Button, x+5 gAccelerator, &Icon
    Gui, Add, Button, x+5 gAccelerator, A&ddress Bar
    Gui, Add, Button, x+5 gAccelerator, &Reload
    Gui, Font
    Gui, Add, StatusBar, vSB gFindTarget
    SB_SetParts(40, 425)
    GoSub, UpdateResourceList
    SB_SetText("Type the path to a folder/file. Auto complete enabled", 2)
    Gui, Show, w655 h535, %GuiTitle%
    Return ; // end of auto-execute section //
    ; ======================================================================================================================
    UpdateResourceList:
    SendInput, {Escape}
    ControlGetText,tFolder,, ahk_id %hSHAC%
    If ! InStr(FileExist(tFolder), "D")
    Folder := tFolder
    Else Folder := tFolder . "\*.*"
    GoSub, SetFolder
    Gui, ListView, LVI
    LV_Delete()
    Gui, ListView, LVR
    LV_Delete()
    SB_SetText(" Loading files.. Please wait" , 2)
    FileCount := 0
    Loop, %Folder%
    {
    If A_LoopFileExt Not in EXE,DLL,CPL,SCR
    Continue
    hModule := LoadLibraryEx(A_LoopFileLongPath)
    If (hModule = 0)
    Continue
    IGCount := 0
    IconGroups := ""
    DllCall("Kernel32.dll\EnumResourceNames", "Ptr", hModule, "Ptr", 14, "Ptr", CallB, "Ptr", 0)
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", hModule)
    If (IGCount = 0)
    Continue
    FileCount++
    StringUpper, FileName, A_LoopFileName
    Gui, ListView, LVR
    LV_ADD("", FileName, IGCount, IconGroups)
    SB_SetText("`t" . FileCount, 1)
    }
    SB_SetText("`t" . FileCount, 1)
    SB_SetText(" Done!" , 2)
    GuiControl, Focus, LVR
    RowNo := 1
    GoSub, LVRSUB
    Gui, ListView, LVI
    LV_Modify(1, "Select")
    Gui, ListView, LVR
    GuiControl, Focus, LVR
    LV_Modify(1, "Select")
    GuiControl, Focus, tFolder
    Return
    ; ======================================================================================================================
    LVR:
    If (A_GuiEvent = "k") {
    If (A_EventInfo = 40 || A_EventInfo = 38) {
    RowNo := LV_GetNext(0, "Focused")
    GoTo, LVRSUB
    Return
    }
    If (A_EventInfo = SaveButton) {
    RowNo := LV_GetNext(0, "Focused")
    If (RowNo <> 0)
    GoSub, ExtractIconRes
    Return
    }
    }
    If (A_GuiEvent <> "Normal")
    Return
    RowNo := A_EventInfo
    If (RowNo = 0) {
    Loop, 16 {
    GuiControl, , IconT%A_Index%, -
    SendMessage, %STM_SETIMAGE%, 0x1, 0, , % "ahk_id " . Icon%A_Index%
    }
    Gui, ListView, LVI
    LV_Delete()
    If (ImageListID)
    IL_Destroy(ImageListID)
    ImageListID := 0
    SB_SetText("", 2)
    SB_SetText("", 3)
    Return
    }
    LVRSUB:
    Gui, ListView, LVR
    LV_GetText(File, RowNo,1)
    LV_GetText(IGC, RowNo,2)
    LV_GetText(IG, RowNo,3)
    SB_SetText("Press <" . KeyName . "> to save all icons in " . File , 2)
    Gui, ListView, LVI
    LV_Delete()
    If (ImageListID)
    IL_Destroy(ImageListID)
    ImageListID := IL_Create(10, 10, 1)
    LV_SetImageList(ImageListID)
    Loop, %IGC%
    IL_Add(ImageListID, tFolder . "\" . File, A_Index)
    Loop, Parse, IG, |
    {
    Gui, ListView, LVI
    LV_Add("Icon" . A_Index, A_LoopField)
    }
    RowNo := 1
    GoSub, LVISUB
    Gui, ListView, LVR
    Return
    ; ======================================================================================================================
    LVI:
    Gui, ListView, LVI
    If (A_GuiEvent = "k") {
    If (A_EventInfo >= 37) && (A_EventInfo <= 40) {
    RowNo := LV_GetNext(0, "Focused")
    LV_GetText(IconGroup, RowNo, 1)
    SB_SetText("Press <" . KeyName . "> to save the Icon Group " . IconGroup, 2)
    GoTo, LVISUB
    Return
    }
    If (A_EventInfo = SaveButton) {
    RowNo := LV_GetNext(0, "Focused")
    If (RowNo <> 0)
    GoSub, ExtractIcon
    Return
    }
    If (A_EventInfo = 0x79) {
    GoSub, ApplyIconToFolder
    Return
    }
    }
    If (A_GuiEvent <> "Normal")
    Return
    RowNo := A_EventInfo
    LV_GetText(IconGroup, RowNo, 1)
    SB_SetText("Press <" . KeyName . "> to save the Icon Group " . IconGroup, 2)
    LVISUB:
    Gui, ListView, LVI
    LV_GetText(IconGroup, RowNo,1)
    hMod := LoadLibraryEx(tFolder . "\" . File)
    Buff := GetResource(hMod, IconGroup, RT_GROUP_ICON, nSize, hResData)
    Icos := NumGet(Buff + 4, 0, "UShort")
    Buff += 6
    SB_SetText("`t" . Icos . " Icons in < Group " . IconGroup . " >", 3)
    Loop, %Icos% {
    W := NumGet(Buff + 0, 0, "UChar")
    H := NumGet(Buff + 0, 1, "UChar")
    BPP := NumGet(Buff + 0, 6, "UShort")
    nID := NumGet(Buff + 0, 12, "UShort")
    Buff += 14
    If ((W + H) = 0) {
    SendMessage, %STM_SETIMAGE%, 0x1, 0, , % "ahk_id " . Icon%A_Index%
    DllCall("Kernel32.dll\FreeResource", "Ptr", hResData)
    GuiControl, ,IconT%A_Index%, PNG ICON
    Continue
    }
    IconD := GetResource(hMod, nID, RT_ICON, nSize, hResData)
    Wi := (W > 64) ? 64 : W
    Hi := (H > 64) ? 64 : H
    hIcon := DllCall("User32.dll\CreateIconFromResourceEx", "Ptr", IconD, "UInt", BPP, "Int", 1
    , "UInt", 0x00030000, "Int", Wi, "Int", Hi, "UInt",(LR_SHARED := 0x8000), "UPtr")
    SendMessage, %STM_SETIMAGE%, 0x1, 0, , % "ahk_id " . Icon%A_Index%
    SendMessage, %STM_SETIMAGE%, 0x1, hIcon, , % "ahk_id " . Icon%A_Index%
    DllCall("Kernel32.dll\FreeResource", "Ptr", hResData)
    GuiControl, , IconT%A_Index%, %W%x%H%-%BPP%b
    }
    Loop % (16 - Icos) {
    Ix := Icos + A_Index
    GuiControl, , IconT%Ix%, -
    SendMessage, %STM_SETIMAGE%, 0x1, 0, , % "ahk_id " . Icon%Ix%
    }
    DllCall("Kernel32.dll\FreeResource", "Ptr", hResData)
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", hModule)
    Return
    ; ======================================================================================================================
    ExtractIconRes:
    FileSelectFolder, TargetFolder, *%DEFF%, 3, Extract Icons! Where to?
    If (TargetFolder = "")
    Return
    GoSub, SetFolder
    hModule := LoadLibraryEx(tFolder . "\" . File)
    Loop, Parse, IG, |
    {
    FileN := SubStr("000" . A_Index, -3) . "-" . SubStr("00000" . A_LoopField, -4) . ".ico"
    SB_SetText((FileN := TargetFolder . "\" . FileN), 2)
    IconGroup := A_LoopField
    GoSub, WriteIcon
    }
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", hModule)
    SB_SetText(IGC . " Icons extracted!", 2)
    DllCall("Kernel32.dll\Sleep", "UInt", 1000)
    SB_SetText(TargetFolder, 2)
    Return
    ; ======================================================================================================================
    ExtractIcon:
    LV_GetText(IconGroup, RowNo, 1)
    FileN := SaveIcon(Deff . "\" . File . "_IG" . SubStr("_00000" . IconGroup, -4) . ".ico")
    If (FileN = "")
    Return
    hModule := LoadLibraryEx(tFolder . "\" . File)
    GoSub, WriteIcon
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", hModule)
    SB_SetText(FileN, 2)
    Return
    ; ======================================================================================================================
    WriteIcon:
    hFile := FileOpen(FileN, "rw", "CP0")
    sBuff := GetResource(hModule, IconGroup, RT_GROUP_ICON, nSize, hResData)
    Icons := NumGet(sBuff + 0, 4, "UShort")
    hFile.RawWrite(sBuff + 0, 6)
    sBuff += 6
    Loop, %Icons% {
    hFile.RawWrite(sBuff + 0, 14)
    hFile.WriteUShort(0)
    sBuff += 14
    }
    DllCall("Kernel32.dll\FreeResource", "Ptr", hResData)
    EOF := hFile.Pos
    hFile.Pos := 18
    Loop %Icons% {
    nID := hFile.ReadUShort()
    hFile.Seek(-2, 1)
    hFile.WriteUInt(EOF)
    DataOffSet := hFile.Pos
    sBuff := GetResource(hModule, nID, RT_ICON, nSize, hResData)
    hFile.Seek(-0, 2)
    hFile.RawWrite(sBuff + 0, nSize)
    DllCall("Kernel32.dll\FreeResource", "Ptr", hResData)
    EOF := hFile.Pos
    hFile.Pos := DataOffset + 12
    }
    hFile.CLose()
    Return
    ; ======================================================================================================================
    SelectSimpleIcon:
    StringTrimLeft, FNo ,A_GuiControl, 1
    GuiControlGet, IconT%fNo%
    If ((IconT := IconT%fNo%) = "-")
    Return
    SB_SetText("Press <" . KeyName . "> to save Icon " . IconT . " from Icon Group " . IconGroup , 2)
    GuiControl, Enable, Hotkey
    GuiControl, Focus, Hotkey
    GuiControl, ,Hotkey
    SetTimer, DisableHotkey, -5000
    Return
    ; ======================================================================================================================
    DisableHotkey:
    GuiControlGet, Hotkey, Enabled
    If (Hotkey) {
    GuiControl, ,Hotkey
    GuiControl, Disable, Hotkey
    GuiControl, Focus, LVI
    StatusBarGetText, SbTxt, 2, IconEx
    InStr(SbTxt, "to save Icon") ? SB_SetText("", 2) :
    }
    Return
    ; ======================================================================================================================
    CreateSimpleIcon:
    SB_SetText("", 2)
    GuiControlGet, Hotkey
    GuiControl, Disable, Hotkey
    IfNotEqual, Hotkey, %KeyName%, Return

    FileN := SaveIcon(Deff . "\" . File . "_" . SubStr("0000" IconGroup, -4) . "_"
    . SubStr("0" . FNo, -1) . "_" . IconT . ".ico")
    If (FileN = "")
    Return
    hModule := LoadLibraryEx(tFolder . "\" . File)
    Buffer := GetResource(hModule, IconGroup, RT_GROUP_ICON, nSize, hResData)
    tBuff := Buffer + 6 + ((Fno - 1) * 14)
    nID := Numget(tBuff + 0, 12, "Ushort")
    hFile := FileOpen(FileN, "w", "CP0")
    hFile.WriteUShort(0)
    hFile.WriteUShort(1)
    hFile.WriteUShort(1)
    hFile.RawWrite(tBuff + 0, 12)
    hFile.WriteUInt(22)
    DllCall("Kernel32.dll\FreeResource", "Ptr", hResData)
    Buff := GetResource(hModule, nID, RT_ICON, nSize, hResData)
    hFile.RawWrite(Buff + 0, nSize)
    hFile.Close()
    DllCall("Kernel32.dll\FreeResource", "Ptr", hResData)
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", hModule)
    SB_SetText(FileN, 2)
    Return
    ; ======================================================================================================================
    FindTarget:
    StatusBarGetText, SB, 2, A
    If FileExist(SB)
    Run, %COMSPEC% /c "Explorer /select`, %SB%", ,Hide
    Return
    ; ======================================================================================================================
    SetFolder:
    ControlGetText, tFolder, , ahk_id %hSHAC%
    If !InStr(FileExist(tFolder), "D") {
    SplitPath, tFolder, , tFolder
    StringUpper, tFolder, tFolder
    ControlSetText, , %tFolder%, ahk_id %hSHAC%
    }
    Return
    ; ======================================================================================================================
    SelectFolder:
    GoSub, SetFolder
    FileSelectFolder, nFolder, *%tFolder%, , Select a Resource Folder
    If (nFolder = "")
    Return
    ControlSetText, ,%nFolder%, ahk_id %hSHAC%
    GoSub, SetFolder
    GoSub, UpdateResourceList
    Return
    ; ======================================================================================================================
    Accelerator:
    If (A_GuiControl = "&File")
    GuiControl, Focus, LVR
    Else If (A_GuiControl = "&Icon")
    GuiControl, Focus, LVI
    ELse If (A_GuiControl = "A&ddress Bar")
    GuiControl,Focus,tFolder
    Else If (A_GuiControl = "&Reload") && FileExist(tFolder . "\" . File) {
    FileAppend, %tFolder%\%File%, %A_Temp%\IconEx.tmp
    Reload
    }
    Return
    ; ======================================================================================================================
    ApplyIconToFolder:
    FileSelectFolder, applyFolder, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}, 0, Apply FolderIcon
    If (applyFolder= "" || ErrorLevel)
    Return
    DesktopIni := applyFolder . "\Desktop.ini"
    IniRead, iconFile, %DesktopIni%, .ShellClassInfo, IconFile, %A_Space%
    If (SubStr(iconFile, 1, 7) == "IconEx_")
    FileDelete, %applyFolder%\%iconFile%
    iconFile := ("IconEx_" . HashStr(A_Now) . ".ico")
    FileN := applyFolder . "\" . iconFile
    hModule := LoadLibraryEx(tFolder . "\" . File)
    LV_GetText(IconGroup, RowNo, 1)
    GoSub, WriteIcon
    DllCall("Kernel32.dll\FreeLibrary", "Ptr", hModule)
    SB_SetText(FileN, 2)
    IniWrite, %IconFile%, %DesktopIni%, .ShellClassInfo, IconFile
    IniWrite, 0 , %DesktopIni%, .ShellClassInfo, IconIndex
    FileSetAttrib, +S, %applyFolder%
    FileSetAttrib, +SH, %DesktopIni%
    FileSetAttrib, +SH, %FileN%
    ; SHCNE_ASSOCCHANGED := 0x8000000
    DllCall("Shell32.dll\SHChangeNotify", "Int", 0x8000000, "UInt", 0x0, "Ptr", 0, "Ptr" ,0)
    Run, Properties "%applyFolder%"
    Return
    ; ======================================================================================================================
    GuiContextMenu:
    StatusBarGetText, SbTxt, 2, IconEx
    StringTrimLeft, SbTxt, SbTxt, 14
    If (SubStr(SbTxt, 1, 4) = "save")
    SendInput, {%KeyName%}
    Return
    ; ======================================================================================================================
    GuiClose:
    ExitApp
    ; ======================================================================================================================
    EnumResNameProc(hModule, lpszType, lpszName, lParam) {
    Global IconGroups, IGCount
    If (lpszName > 0xFFFF)
    lpszName := StrGet(lpszName)
    IconGroups .= (IconGroups <> "" ? "|" : "") . lpszName
    IGCount++
    Return True
    }
    ; ======================================================================================================================
    GetResource(hModule, rName, rType, ByRef nSize, ByRef hResData) {
    Arg := (rName + 0 = "") ? &rName : rName
    hResource := DllCall("Kernel32.dll\FindResource", "Ptr", hModule, "Ptr", Arg, "Ptr", rType, "UPtr")
    nSize := DllCall("Kernel32.dll\SizeofResource", "Ptr", hModule, "Ptr", hResource, "UInt")
    hResData := DllCall("Kernel32.dll\LoadResource", "Ptr", hModule, "Ptr" , hResource, "UPtr")
    Return DllCall("Kernel32.dll\LockResource", "Ptr", hResData, "UPtr")
    }
    ; ======================================================================================================================
    SaveIcon(Filename, Prompt := "Save Icon As") {
    FileSelectFile, File, 16, %Filename%, %Prompt%, Icon (*.ico)
    Return ((File <> "" && SubStr(File, -3) <> ".ico") ? File . ".ico" : File)
    }
    ; ======================================================================================================================
    LoadLibraryEx(File) {
    Return DllCall("Kernel32.dll\LoadLibraryEx", "Str", File, "Ptr", 0, "UInt", 0x02, "UPtr")
    }
    ; ======================================================================================================================
    HashStr(sStr) {
    VarSetCapacity(hHash, 16, 0)
    DllCall("Shlwapi.dll\UrlHash", "Str", sStr, "UIntP", dHash, "UInt", 4)
    If (A_IsUnicode)
    DllCall("msvcrt.dll\swprintf", "Str", hHash, "Str", "%08X", "UInt", dHash)
    Else
    DllCall("msvcrt.dll\sprintf", "Str", hHash, "Str", "%08X", "UInt", dHash)
    Return hHash
    }