图像句柄

要使用图标或位图句柄代替图像文件名, 请使用以下语法:

HBITMAP:BitmapHandle
HICON:IconHandle

用实际句柄值替换 BitmapHandleIconHandle. 例如, "hicon:" handle, 其中 handle 是包含图标句柄的变量.

以下内容支持此语法:

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

默认情况下, AutoHotkey 会将句柄视为从文件中载入图像 - 例如, 销毁 GUI 时会删除 Picture 控件上使用的位图, 并且如果需要调整图像大小, 通常会立即删除该图像. 为避免这种情况, 请在冒号和句柄之间放置一个星号. 例如: "hbitmap:*" handle. 除了 ImageSearch, 这会强制该函数获取图像的副本.

示例

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

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

;创建菜单.
Fmenu := Menu()

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

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

另请参阅: LoadPicture 的示例 #1.