How would you make a specific menu (e.g., the file menu) appear when the tab in the task bar is right clicked (yes, the task bar, not the tray). I want to be able to access anything in my FIle menu from the task bar. Thx in advance! :wave:
Printable View
How would you make a specific menu (e.g., the file menu) appear when the tab in the task bar is right clicked (yes, the task bar, not the tray). I want to be able to access anything in my FIle menu from the task bar. Thx in advance! :wave:
First, it is not hard. But if you have many menus (and submenus), things can get complicated. ;)
Try this:
VB Code:
'[b][color=red]Inside a form[/color][/b] Option Explicit ' Create a form with following menus: (keep the order) ' mnuFile ' | ' |--> mnuNew ' |--> mnuOpen ' |--> mnuClose Private Sub Form_Load() AddToSystemMenu Me.hwnd End Sub Public Sub mnuNew_Click() '[b]Must be public[/b] MsgBox "mnuNew_Click" End Sub Public Sub mnuOpen_Click() '[b]Must be public[/b] MsgBox "mnuOpen_Click" End Sub Public Sub mnuClose_Click() '[b]Must be public[/b] MsgBox "mnuClose_Click" End SubModified form this code.VB Code:
'[b][color=red]Inside a module[/color][/b] Option Explicit Private OriginalWindowProc As Long Public Const MF_STRING = &H0& Public Const MF_ENABLED = &H0& Public Const MF_POPUP As Long = &H10& Public Const MF_SEPARATOR As Long = &H800& ' Public Const IDM_MYMENUITEM = 2003 Public Const WM_SYSCOMMAND = &H112 Public Const GWL_WNDPROC = (-4) Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Public Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wflags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long ' Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long Declare Function CreatePopupMenu Lib "user32" () As Long Public lNewPopupMenu As Long Public Sub AddToSystemMenu(ByVal hwnd As Long) Dim hSystemMenu As Long ' Get the system menu's handle. hSystemMenu = GetSystemMenu(hwnd, False) 'Get the form's File PopUp menu lNewPopupMenu = GetSubMenu(GetMenu(hwnd), 0) '------------------------------------------- AppendMenu hSystemMenu, MF_SEPARATOR, ByVal 0&, ByVal 0& 'A separetor AppendMenu hSystemMenu, MF_POPUP, lNewPopupMenu, "File" 'File '------------------------------------------- ' Tell Windows to call MyMenuProc when a system ' menu command is selected. OriginalWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, _ AddressOf MyMenuProc) End Sub Public Function MyMenuProc(ByVal hwnd As Long, ByVal msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long ' If the custom menu item was selected display a message. If msg = WM_SYSCOMMAND Then 'System menu clicked Select Case wParam Case GetMenuItemID(lNewPopupMenu, 0): '1st item of the menu - New Form1.mnuNew_Click Case GetMenuItemID(lNewPopupMenu, 1): '2nd item of the menu - Open Form1.mnuOpen_Click Case GetMenuItemID(lNewPopupMenu, 2): '3rd item of the menu - Close Form1.mnuClose_Click Exit Function End Select End If ' Otherwise pass the command on for normal processing. MyMenuProc = CallWindowProc(OriginalWindowProc, hwnd, msg, _ wParam, lParam) End Function
SWEET!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
This is just what I've been waiting for! Thank you so much! :wave: :wave: :wave: :wave: :wave: :wave: :wave: :wave: :wave: :wave: :wave: :wave: ;) :wave: