You need to subclass the form, then you'll get the WM_MENUSELECT message when the item is highlighted. The LoWord of the wParam item contains the ID of the item, although with the items on a VB menu it's a little complicated since you don't assign the IDs yourself. One technique then is to, when the form loads, store the IDs in a public array:
Code:
Private Sub AssignMenuIDs()
'Copies the item id numbers for the main menu bar
Dim hMenu As Long
Dim hSubMenu As Long
Dim i As Long
hMenu = GetMenu(Me.hWnd)
'File menu- 14 items
hSubMenu = GetSubMenu(hMenu, 0)
ReDim midFile(13)
For i = 0 To 13
midFile(i) = GetMenuItemID(hSubMenu, i)
Next i
'and so on for other menus
Then if I'm doing something like displaying a tip in a status bar,
Code:
Public Function F1WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'[...]
Select Case uMsg
Case WM_MENUSELECT
szt = QueryMenuTip(LoWord(wParam))
Form1.StatusBar1.Panels(1).Text = szt
'[...]
End Function
Public Function QueryMenuTip(idCmd As Long) As String
If idCmd = midFile(0) Then QueryMenuTip = "Menu Item 1"
If idCmd = midFile(1) Then QueryMenuTip = "Menu Item 2"
If idCmd = midFile(2) Then QueryMenuTip = "Menu Item 3"
'[....and so on]
End Function
Also, if you want to detect when the mouse moves over the main menu item itself, and not a subitem--eg File Edit etc, you would, still responding to WM_MENUSELECT, check If (HiWord(wParam) And MF_POPUP) = MF_POPUP Then the LoWord of the wParam in this case contains the position of menu, 0 for File, 1 for Edit, etc.