Find all our projects in development below.
All source code is GNU General Public License (GPL)
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