Valhalla Legends Forums Archive | General Programming | [win32] Getting menu items of topmost window?

AuthorMessageTime
St0rm.iD
Was wondering if there is a way to get a list of all the menu items of the active window (got the handle using GetActiveWindow) and their key shortcuts.

Thanks a bunch.
November 19, 2003, 1:19 AM
Skywing
[quote author=St0rm.iD link=board=5;threadid=3695;start=0#msg30024 date=1069204797]
Was wondering if there is a way to get a list of all the menu items of the active window (got the handle using GetActiveWindow) and their key shortcuts.

Thanks a bunch.
[/quote]
Try GetSystemMenu. If you can't use this function on the window residing in a different process (the documentation doesn't say anything about this that I can see), you'll have to use code injection to access the menu.
November 19, 2003, 1:06 PM
dev invisible
Public Type MENUITEMINFO
cbSize As Long
fMask As Long
fType As Long
fState As Long
wID As Long
hSubMenu As Long
hbmpChecked As Long
hbmpUnchecked As Long
dwItemData As Long
dwTypeData As String
cch As Long
End Type

Public Declare Function GetActiveWindow Lib "user32" () As Long
Public Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Public Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long
Public Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Public Const MIIM_TYPE = &H10
------------------------------------------------------------

These are all the declarations you should need to do what you want. Your using GetActiveWindow to grab the hWnd of a program. GetMenu gets the hWnd of the menu. GetMenuItemCount gets the number of menu items for the menu hWnd passed to it. GetSubMenu gets the menu hWnd for the index of the submenu of the hWnd you pass in. GetMenuItemInfo is passed a menu hWnd, the index of the menu item to get info for, false (to state that the previous paramater is a menu location and not a menuID), and a menuInfo object. The menuInfo object should have its cbSize parameter set to the length of itself (len(menuInfo)), its dwType data initialized large enough to hold your menu info (i use string(128, chr(0)), its cch parameter set to len(menuInfo.dwTypeData), and its fMask set to the MIIM_TYPE constant. After passing this object to the GetMenuItemInfo function, the dwTypeData parameter will be filled with the info for that menu. The easiest way to get at the info you want (the name and shortcut), do a replace chr(0) with "".

[code]
Private Sub DisplayMenuItems(lngMenuHwnd As Long)
Dim i As Integer, j As Integer
Dim s As String
Dim menuInfo As MENUITEMINFO

For i = 0 To GetMenuItemCount(lngMenuHwnd) - 1
menuInfo.cbSize = Len(menuInfo)
menuInfo.dwTypeData = String(128, Chr(0))
menuInfo.cch = Len(menuInfo.dwTypeData)
menuInfo.fMask = MIIM_TYPE
Call GetMenuItemInfo(lngMenuHwnd, i, True, menuInfo)
menuInfo.dwTypeData = Replace(menuInfo.dwTypeData, Chr(0), "")
s = ""
For j = 1 To Len(menuInfo.dwTypeData)
s = s & " " & Asc(Mid(menuInfo.dwTypeData, j, 1))
Next
Debug.Print "Length: " & Len(menuInfo.dwTypeData) & vbCrLf & "Data: " & menuInfo.dwTypeData & vbCrLf & s
Next

End Sub
[/code]

outputs
----------
Length: 11
Data: Cu&t Ctrl+X
67 117 38 116 9 67 116 114 108 43 88
Length: 12
Data: &Copy Ctrl+C
38 67 111 112 121 9 67 116 114 108 43 67
Length: 13
Data: &Paste Ctrl+P
38 80 97 115 116 101 9 67 116 114 108 43 80
Length: 18
Data: Select &All Ctrl+A
83 101 108 101 99 116 32 38 65 108 108 9 67 116 114 108 43 65
-------------------
Note: chr(9) is used to seperate the text from the shortcut
December 10, 2003, 9:32 PM
St0rm.iD
Although a dead thread, I have been searching forever for that. Thanks a lot...I'll gogo port to python immediately :)
December 10, 2003, 10:16 PM

Search