SetWorkingDir, %A_ScriptDir%
ExeFil := "444444.exe"
IcoFil := "9.ico"
ReplaceIcon(ExeFil, IcoFil)
; https://www.autohotkey.com/boards/viewtopic.php?p=227708#p227708
; ============================================================================
ReplaceIcon(ExeFil, IcoFil) {
Global _EI_HighestIconID
Static IconID := 159
Module := DllCall("BeginUpdateResource", "str", ExeFil, "uint", 0, "ptr")
ids := EnumIcons(ExeFil, IconID)
If !IsObject(ids)
Return false
f := FileOpen(IcoFil, "r")
If !IsObject(f)
Return false
VarSetCapacity(igh, 8), f.RawRead(igh, 6)
If (NumGet(igh, 0, "UShort") != 0) || (NumGet(igh, 2, "UShort") != 1)
Return false
wCount := NumGet(igh, 4, "UShort")
VarSetCapacity(rsrcIconGroup, rsrcIconGroupSize := 6 + wCount*14)
NumPut(NumGet(igh, "Int64"), rsrcIconGroup, "Int64") ; fast copy
ige := &rsrcIconGroup + 6
; Delete all the images
Loop, % ids.MaxIndex()
DllCall("UpdateResource", "ptr", Module, "ptr", 3, "ptr", ids[A_Index], "ushort"
, 0x409, "ptr", 0, "uint", 0, "uint")
Loop, %wCount% {
thisID := ids[A_Index]
If !thisID
thisID := ++ _EI_HighestIconID
f.RawRead(ige+0, 12) ; read all but the offset
NumPut(thisID, ige+12, "UShort")
imgOffset := f.ReadUInt()
oldPos := f.Pos
f.Pos := imgOffset
VarSetCapacity(iconData, iconDataSize := NumGet(ige+8, "UInt"))
f.RawRead(iconData, iconDataSize)
f.Pos := oldPos
DllCall("UpdateResource", "ptr", Module, "ptr", 3, "ptr", thisID, "ushort"
, 0x409, "ptr", &iconData, "uint", iconDataSize, "uint")
ige += 14
}
DllCall("UpdateResource", "ptr", Module, "ptr", 14, "ptr", IconID, "ushort", 0x409, "ptr", &rsrcIconGroup, "uint", rsrcIconGroupSize, "uint")
DllCall("EndUpdateResource", "ptr", Module, "uint", 0)
}
EnumIcons(ExeFil, IconID) {
; RT_GROUP_ICON = 14
; RT_ICON = 3
Global _EI_HighestIconID
Static pEnumFunc := RegisterCallback("EnumIcons_Enum")
hModule := DllCall("LoadLibraryEx", "str", ExeFil, "ptr", 0, "ptr", 2, "ptr")
If !hModule
Return
_EI_HighestIconID := 0
; ***
; If the following section is removed, ReplaceIcon() seems to work with
; EVERY executable (not only with AutoHotkex.exe or AutoHotkeySC.bin)!!!
; ======================================================================
/*
If DllCall("EnumResourceNames", "ptr", hModule, "ptr", 3, "ptr", pEnumFunc, "uint", 0) = 0
{
DllCall("FreeLibrary", "ptr", hModule)
Return
}
*/
hRsrc := DllCall("FindResource", "ptr", hModule, "ptr", IconID, "ptr", 14, "ptr")
hMem := DllCall("LoadResource", "ptr", hModule, "ptr", hRsrc, "ptr")
pDirHeader := DllCall("LockResource", "ptr", hMem, "ptr")
pResDir := pDirHeader + 6
wCount := NumGet(pDirHeader+4, "UShort")
iconIDs := []
Loop, %wCount% {
pResDirEntry := pResDir + (A_Index-1)*14
iconIDs[A_Index] := NumGet(pResDirEntry+12, "UShort")
}
DllCall("FreeLibrary", "ptr", hModule)
Return iconIDs
}
EnumIcons_Enum(hModule, Type, Name, lParam) {
Global _EI_HighestIconID
If (Name < 0x10000) && (Name > _EI_HighestIconID)
_EI_HighestIconID := Name
Return 1
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)