Projects

Find all our projects in development below.
All source code is GNU General Public License (GPL)

WindowControl

Browsing clsMenuController.cls (5.73 KB)

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "clsMenuController"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit

' clsMenuController: exposes a menu-controller interface
'
' Copyright (c) 2008 JaviteSoft ( http://www.javitesoft.com )

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetMenuState Lib "user32" (ByVal hMenu As Long, ByVal wID As Long, ByVal wFlags As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_COMMAND = &H111
Private Const WM_SYSCOMMAND = &H112

' System Menu Command Values
Private Const SC_SIZE = &HF000&
Private Const SC_MOVE = &HF010&
Private Const SC_MINIMIZE = &HF020&
Private Const SC_MAXIMIZE = &HF030&
Private Const SC_NEXTWINDOW = &HF040&
Private Const SC_PREVWINDOW = &HF050&
Private Const SC_CLOSE = &HF060&
Private Const SC_VSCROLL = &HF070&
Private Const SC_HSCROLL = &HF080&
Private Const SC_MOUSEMENU = &HF090&
Private Const SC_KEYMENU = &HF100&
Private Const SC_ARRANGE = &HF110&
Private Const SC_RESTORE = &HF120&
Private Const SC_TASKLIST = &HF130&
Private Const SC_SCREENSAVE = &HF140&
Private Const SC_HOTKEY = &HF150&

Private m_hWnd As Long
Private m_hMenu As Long
Private m_bIsSysMenu As Boolean

Public Function Init(ByVal hMenu As Long, ByVal hWnd As Long, Optional ByVal bIsSysMenu As Boolean = False) As clsMenuController

    m_hMenu = hMenu
    m_hWnd = hWnd
    m_bIsSysMenu = bIsSysMenu
    If m_hMenu Then
        Set Init = Me
    Else
        Set Init = Nothing
    End If

End Function

Public Function InitByHandle(ByVal hWnd As Long) As clsMenuController
    Set InitByHandle = Init(GetMenu(hWnd), hWnd)
End Function

Public Function InitByWindow(Optional ByVal strClassName As String = vbNullString, Optional ByVal strText As String = vbNullString) As clsMenuController
    Set InitByWindow = InitByHandle(FindWindow(strClassName, strText))
End Function

Public Property Get hWnd() As Long
    hWnd = m_hWnd
End Property

Public Property Get hMenu() As Long
    hMenu = m_hMenu
End Property

Public Function GetWindow() As clsWindowController

    Dim wndController As New clsWindowController
    Set wndController = wndController.InitByHandle(m_hWnd)
    
    Set GetWindow = wndController

End Function

Public Function GetMenuHandle() As Long
    GetMenuHandle = m_hMenu
End Function

Public Function GetWindowHandle() As Long
    GetWindowHandle = m_hWnd
End Function

Public Property Get ChildCount() As Long
    ChildCount = GetMenuItemCount(m_hMenu)
End Property

Public Function GetSysMenu() As clsMenuController
    Set GetSysMenu = New clsMenuController
    Set GetSysMenu = GetSysMenu.Init(GetSystemMenu(m_hWnd, False), m_hWnd, True)
End Function

Public Function GetChildState(ByVal menuChild As clsMenuItem) As Long
    GetChildState = GetMenuState(m_hMenu, menuChild.GetMenuHandle(), 0&)
End Function

Public Function GetChildMenu(ByVal nPos As Long) As clsMenuItem
    Set GetChildMenu = New clsMenuItem
    Set GetChildMenu = GetChildMenu.Init(Me, IIf(m_bIsSysMenu, nPos, GetSubMenu(m_hMenu, nPos)))
End Function

Public Function GetSysMenuID(ByVal strID As String) As Long

    Select Case strID
        Case "SC_SIZE": GetSysMenuID = SC_SIZE
        Case "SC_MOVE": GetSysMenuID = SC_MOVE
        Case "SC_MINIMIZE": GetSysMenuID = SC_MINIMIZE
        Case "SC_MAXIMIZE": GetSysMenuID = SC_MAXIMIZE
        Case "SC_NEXTWINDOW": GetSysMenuID = SC_NEXTWINDOW
        Case "SC_PREVWINDOW": GetSysMenuID = SC_PREVWINDOW
        Case "SC_CLOSE": GetSysMenuID = SC_CLOSE
        Case "SC_VSCROLL": GetSysMenuID = SC_VSCROLL
        Case "SC_HSCROLL": GetSysMenuID = SC_HSCROLL
        Case "SC_MOUSEMENU": GetSysMenuID = SC_MOUSEMENU
        Case "SC_KEYMENU": GetSysMenuID = SC_KEYMENU
        Case "SC_ARRANGE": GetSysMenuID = SC_ARRANGE
        Case "SC_RESTORE": GetSysMenuID = SC_RESTORE
        Case "SC_TASKLIST": GetSysMenuID = SC_TASKLIST
        Case "SC_SCREENSAVE": GetSysMenuID = SC_SCREENSAVE
        Case "SC_HOTKEY": GetSysMenuID = SC_HOTKEY
        Case Else: GetSysMenuID = 0
    End Select

End Function

Public Function ClickChildItem(ByVal nPos As Long) As Long
    ClickChildItem = SendMessage(Me.GetWindowHandle(), _
        IIf(m_bIsSysMenu, WM_SYSCOMMAND, WM_COMMAND), _
        GetMenuItemID(m_hMenu, nPos), ByVal m_hMenu)
End Function

Public Function ClickChildItem2(ByVal menuChild As clsMenuItem) As Long
    ClickChildItem2 = SendMessage(Me.GetWindowHandle(), _
        IIf(m_bIsSysMenu, WM_SYSCOMMAND, WM_COMMAND), _
        menuChild.GetMenuHandle(), ByVal m_hMenu)
End Function

Public Function BeginChildEnum() As clsMenuEnum

    Set BeginChildEnum = New clsMenuEnum
    BeginChildEnum.Init Me
    
End Function

Public Sub EndChildEnum(ByVal objEnum As clsMenuEnum)
    Set objEnum = Nothing
End Sub

Download clsMenuController.cls

Back to file list


Back to project page