VBcoders Browse New Submit Contact Sign In

No account? Register free

Forgot password?

Extending System Menu

Karl P. Grear  (2 Submissions)   Custom Controls/Forms/Menus   Visual Basic 3.0   Advanced   Wed 3rd February 2021

This code example will append a separator and a new MenuItem 'Always on Top' to the system menu of any form.
The menu is affected weather left clicked from the control box on the form or right clicked from the taskbar.
Subclassing is used to trap when the 'Always on Top' item is clicked.
The custom message handler uses the SetWindowPos function to keep window on top or reset it to normal.
Also on a lark I traped out the close menu item to prompt before closing. If you say yes then the close message it passed otherwise the close message is traped out and the form stays open.


Side Effects
'Be careful and save work often. Subclassing can cause your system to GPF.

API Declarations
'**** MODULE LEVEL Declarations ****

Option Explicit

Dim MenuItemID As Long
Dim MenuHandle As Long
Dim MenuCloseID As Long

Dim Checked As Boolean

Public OldProc As Long

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long) As Long

Public Const GWL_WNDPROC = (-4)

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

'The window message to monitor
Const WM_SYSCOMMAND = &H112

'menu API's
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 GetSystemMenu Lib "user32" (ByVal Hwnd As Long, ByVal bRevert As Long) As Long

Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long

Declare Function DrawMenuBar Lib "user32" (ByVal Hwnd As Long) As Long

Declare Function CheckMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long

Public Const MF_SEPARATOR = &H800&
Public Const MF_CHECKED = &H8&
Public Const MF_UNCHECKED = &H0&

'Window Positioning API
Declare Function SetWindowPos Lib "user32.dll" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Const SWP_NOMOVE = &H2
Const SWP_NOSIZE = &H1

'Used to set window to always be on top or not
Const HWND_NOTOPMOST = -2
Const HWND_TOPMOST = -1


Rate Extending System Menu (9(9 Vote))
Extending System Menu.bas

Extending System Menu Comments

No comments yet — be the first to post one!

Post a Comment

0/1000 characters