Author: Lexikos Last Modified: 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="")
For more details of the functions's parameters and return value, please see it's source code or the document.
The documentation is copied part from first post of Lexikos from the discussion thread.
For update's details and remarks related to the functions, please see the AutoHotkey Forum: http://www.autohotkey.com/forum/viewtopic.php?t=21991
The functions is an open source item under the Public Domain license. For details, please see 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
}
}