Attribute VB_Name = "modSysMenu"
Option Explicit

Public Declare Function GetSystemMenu Lib "user32.dll" (ByVal Hwnd As Long, ByVal bRevert _
    As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long
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 Const MIIM_STATE = &H1
Public Const MIIM_ID = &H2
Public Const MIIM_TYPE = &H10
Public Const MFT_SEPARATOR = &H800
Public Const MFT_STRING = &H0
Public Const MFS_ENABLED = &H0
Public Const MFS_CHECKED = &H8
Public Declare Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal _
    hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii _
    As MENUITEMINFO) As Long
Public Declare Function SetMenuItemInfo Lib "user32.dll" Alias "SetMenuItemInfoA" (ByVal _
    hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii _
    As MENUITEMINFO) As Long

Public 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
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal Hwnd _
    As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = -4
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal _
    lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam _
    As Long, ByVal lParam As Long) As Long
Public Const WM_SYSCOMMAND = &H112
Public Const WM_INITMENU = &H116

Public pOldProc As Long
Public ontop As Boolean

Public Function WindowProc(ByVal Hwnd As Long, ByVal uMsg As Long, ByVal wParam _
        As Long, ByVal lParam As Long) As Long
    Dim hSysMenu As Long
    Dim mii As MENUITEMINFO
    Dim retval As Long
    
    Select Case uMsg
    Case WM_INITMENU
        hSysMenu = GetSystemMenu(Hwnd, 0)
        With mii
            .cbSize = Len(mii)
            .fMask = MIIM_STATE
            .fState = MFS_ENABLED Or IIf(ontop, MFS_CHECKED, 0)
        End With
        retval = SetMenuItemInfo(hSysMenu, 1, 0, mii)
        WindowProc = 0
    Case WM_SYSCOMMAND
        If wParam = 1 Then
            ontop = Not ontop
            If ontop = True Then
                SetWindowPos Hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
            Else
                SetWindowPos Hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
            End If
            WindowProc = 0
        Else
            WindowProc = CallWindowProc(pOldProc, Hwnd, uMsg, wParam, lParam)
        End If
    Case Else
        WindowProc = CallWindowProc(pOldProc, Hwnd, uMsg, wParam, lParam)
    End Select
End Function



Public Function LoadSysMenu(Hwnd As Long)
    Dim hSysMenu As Long
    Dim count As Long
    Dim mii As MENUITEMINFO
    Dim retval As Long
    
    hSysMenu = GetSystemMenu(Hwnd, 0)
    count = GetMenuItemCount(hSysMenu)
    
    With mii
        .cbSize = Len(mii)
        .fMask = MIIM_ID Or MIIM_TYPE
        .fType = MFT_SEPARATOR
        .wID = 0
    End With
    retval = InsertMenuItem(hSysMenu, count, 1, mii)
    
    With mii
        .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE
        .fType = MFT_STRING
        .fState = MFS_ENABLED
        .wID = 1
        .dwTypeData = "Window on &Top"
        .cch = Len(.dwTypeData)
    End With
    retval = InsertMenuItem(hSysMenu, count + 1, 1, mii)
    
    ontop = False
    pOldProc = SetWindowLong(Hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Function

Public Sub UnloadSysMenu(Hwnd As Long)
    Dim retval As Long
    
    retval = SetWindowLong(Hwnd, GWL_WNDPROC, pOldProc)
    retval = GetSystemMenu(Hwnd, 1)

End Sub

