Image 句柄

AutoHotKey

Image 句柄 [v1.1.23+]

要在图像文件名(image filename)的位置使用一个图标或位图的句柄, 使用如下的表示法:

HBITMAP:bitmap-handle
HICON:icon-handle

用真实的句柄值替换 bitmap-handleicon-handle . 例如, 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.