作者: Lexikos 最近更新时间: 20100313
Provides a set of functions for implementing icons in menus. AutoHotkey does not provide native support for Icons within Menus.
MI_DllProcAorW(dll, func)
MI_EnableOwnerDrawnMenus(hwnd="")
MI_ExtractIcon(Filename, IconNumber, IconSize)
MI_GetBitmapFromIcon32Bit(h_icon, width=0, height=0)
MI_GetMenuHandle(menu_name)
MI_OwnerDrawnMenuItemWndProc(hwnd, Msg, wParam, lParam)
MI_RemoveIcons(MenuNameOrHandle)
MI_SetMenuItemBitmap(MenuNameOrHandle, ItemPos, hBitmap)
MI_SetMenuItemIcon(MenuNameOrHandle, ItemPos, FilenameOrHICON, IconNumber=1, IconSize=0, ByRef unused1="", ByRef unused2="")
MI_SetMenuStyle(MenuNameOrHandle, style)
MI_ShowMenu(MenuNameOrHandle, x="", y="")
关于函数的参数和返回值, 请参阅其源码或 此文档.
The documentation is copied part from first post of Lexikos from the discussion thread.
关于此函数(集)的更新细节和注意事项, 请参见 AutoHotkey 论坛: http://www.autohotkey.com/forum/viewtopic.php?t=21991
此函数(集)是基于 Public Domain 许可的开源项目. 想了解许可详情, 请参见 lexikos-license.txt
; Uncomment this if MI.ahk is not in your function library: ;#include %A_ScriptDir%\MI.ahk #NoEnv ; Sample menu items. Menu, M, Add, 16x16 Icon, ItemClick Menu, M, Add, 32x32 Icon, ItemClick Menu, M, Add, 48x48 Icon, ItemClick ; Set item 1's icon to shell32.dll, icon 4, 16x16. MI_SetMenuItemIcon("M", 1, "shell32.dll", 4, 16) ; Set item 2's icon to shell32.dll, icon 4, 32x32. MI_SetMenuItemIcon("M", 2, "shell32.dll", 4, 32) ; Windows 2000 or later required (supports sizes other than 16x16 and 32x32): MI_SetMenuItemIcon("M", 3, "shell32.dll", 4, 48) ; Usually looks better: MI_SetMenuStyle("M", 0x4000000) ; Note: This menu is shown automatically after setting up the tray menu. ; ; Icons in the Tray menu! ; ; Refer to a menu by handle for efficiency. hTM := MI_GetMenuHandle("Tray") if (A_OSVersion != "WIN_VISTA") { ; It is necessary to hook the tray icon for owner-drawing to work. ; (Owner-drawing is not used on Windows Vista.) OnMessage(0x404, "AHK_NOTIFYICON") OnMessage(0x111, "WM_COMMAND") ; To track "pause" status. MI_SetMenuStyle(hTM, 0x4000000) ; MNS_CHECKORBMP (optional) } SplitPath, A_AhkPath,, SpyPath SpyPath = %SpyPath%\AU3_Spy.exe MI_SetMenuItemIcon(hTM, 1, A_AhkPath, 1, 16) ; open MI_SetMenuItemIcon(hTM, 2, A_WinDir "\hh.exe", 1, 16) ; help ;- MI_SetMenuItemIcon(hTM, 4, SpyPath, 1, 16) ; spy ; reload - icon needed! MI_SetMenuItemIcon(hTM, 6, A_AhkPath, 2, 16) ; edit ;- MI_SetMenuItemIcon(hTM, 8, A_AhkPath, 3, 16) ; suspend MI_SetMenuItemIcon(hTM, 9, A_AhkPath, 4, 16) ; pause MI_SetMenuItemBitmap(hTM, 10, 8) ; exit MI_ShowMenu("M") return ItemClick: return AHK_NOTIFYICON(wParam, lParam) { global hTM, M_IsPaused if (lParam = 0x205) ; WM_RBUTTONUP { ; Update "Suspend Script" and "Pause Script" checkmarks. DllCall("CheckMenuItem","uint",hTM,"uint",65305,"uint",A_IsSuspended ? 8:0) DllCall("CheckMenuItem","uint",hTM,"uint",65306,"uint",M_IsPaused ? 8:0) ; Show menu to allow owner-drawing. MI_ShowMenu(hTM) return 0 } } WM_COMMAND(wParam, lParam, Msg, hwnd) { Critical global M_IsPaused id := wParam & 0xFFFF if id in 65306,65403 ; tray pause, file menu pause { ; When the script is not paused, WM_COMMAND() is called once for ; AutoHotkey --** and once for OwnerDrawnMenuMsgWin **--. DetectHiddenWindows, On WinGetClass, cl, ahk_id %hwnd% if cl != AutoHotkey return ; This will become incorrect if "pause" is used from the script. M_IsPaused := ! M_IsPaused } }