Image 句柄 [v1.1.23+]

要在图像文件名的位置使用一个图标或位图的句柄, 使用如下的语法:

HBITMAP:BitmapHandle
HICON:IconHandle

用真实的句柄值替换 BitmapHandleIconHandle. 例如, hicon:%handle%(或在表达式中的 "hicon:" handle), 这里的 handle 是一个包含图标句柄的变量.

下列命令和函数支持这种语法:

位图或图标句柄是一个标识该位图或图标所处内存的数值. 大多数脚本没有必要处理该句柄, 因为在大多数情况下, AutoHotKey 会自动从文件载入图像并在不用时释放. 上面的语法是当脚本从其他资源中取得图标或位图时(如发送 WM_GETICON 消息到某个窗口) 供脚本使用的. 这也可以和 LoadPicture() 一起使用以避免从文件中多次载入同一图像.

AutoHotKey 默认将 Image 句柄当作从文件中载入图像一样, 比如, 当 GUI 被销毁时用于 Picture 控件的位图也会被释放, 当图像需要调整尺寸时通常也会被立即释放. 为避免此种情况, 在分号和句柄之间加入一个星号, 如: hbitmap:*%handle%(或在表达式中的 "hbitmap:*" handle). 例外的是用在 ImageSearch 命令中会使该命令复制一份图像.

示例

显示一个与模式匹配的前 n 个文件及其图标的菜单.

pattern := A_ScriptDir "\*"
n := 15

; 为 SHFILEINFOW 结构体申请内存.
VarSetCapacity(fileinfo, fisize := A_PtrSize + 688)

Loop, Files, %pattern%, FD
{
    ; 为每个文件添加一个菜单项.
    Menu F, Add, %A_LoopFileName%, donothing
    
    ; 获取文件的图标.
    if DllCall("shell32\SHGetFileInfoW", "Wstr", A_LoopFileFullPath
        , "UInt", 0, "Ptr", &fileinfo, "UInt", fisize, "UInt", 0x100)
    {
        hicon := NumGet(fileinfo, 0, "Ptr")
        ; 设置菜单项的图标.
        Menu F, Icon, %A_Index%&, HICON:%hicon%
        ; 因为我们使用了 ":" 而不是 ":*", 在程序退出或菜单被删除时
        ; 这些图标也会被自动释放
    }
}
until A_Index = n
Menu F, Show
donothing:
return

参阅: LoadPicture() 的示例 #1.