また、リボンの最小化を実行する。
Option Compare Database Option Explicit Const CHILDID_SELF = 0& Const OBJID_CLIENT = &HFFFFFFFC Const ROLE_SYSTEM_PUSHBUTTON = &H2B Declare PtrSafe Function AccessibleChildren Lib "oleacc" ( _ ByVal paccContainer As IAccessible, _ ByVal iChildStart As Long, _ ByVal cChildren As Long, _ ByRef rgvarChildren As Any, _ ByRef pcObtained As Long _ ) As Long Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" ( _ ByVal hWnd As LongPtr, _ ByVal dwId As Long, _ riid As Any, _ ByRef ppvObject As IAccessible _ ) As Long Declare PtrSafe Function IIDFromString Lib "ole32" ( _ ByVal lpsz As LongPtr, _ lpiid As Any _ ) As Long Declare PtrSafe Function FindWindowEx Lib "user32" _ Alias "FindWindowExA" ( _ ByVal hWnd1 As LongPtr, _ ByVal hWnd2 As LongPtr, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String _ ) As LongPtr 'リボンが最小化されているかどうか Function IsRibbonMinimize() As Boolean Dim IID(0 To 3) As Long, acc As IAccessible, targetAcc As IAccessible IIDFromString StrPtr("{618736E0-3C3D-11CF-810C-00AA00389B71}"), _ IID(0) AccessibleObjectFromWindow getHwnd, _ OBJID_CLIENT, _ IID(0), _ acc Set targetAcc = GetAcc(acc, "リボンの最小化", ROLE_SYSTEM_PUSHBUTTON) Select Case targetAcc.accState(CHILDID_SELF) Case 1048576 IsRibbonMinimize = False Case 1048584 IsRibbonMinimize = True End Select End Function 'リボンを最小化する Sub RibbonMinimize() Dim IID(0 To 3) As Long, acc As IAccessible, targetAcc As IAccessible IIDFromString StrPtr("{618736E0-3C3D-11CF-810C-00AA00389B71}"), _ IID(0) AccessibleObjectFromWindow getHwnd, _ OBJID_CLIENT, _ IID(0), _ acc Set targetAcc = GetAcc(acc, "リボンの最小化", ROLE_SYSTEM_PUSHBUTTON) If targetAcc.accState(CHILDID_SELF) = 1048576 Then targetAcc.accDoDefaultAction CHILDID_SELF End If End Sub Function getHwnd() As LongPtr Dim pHwnd As LongPtr pHwnd = FindWindowEx(hWndAccessApp, 0, "MsoCommandBarDock", "MsoDockTop") pHwnd = FindWindowEx(pHwnd, 0, "MsoCommandBar", "Ribbon") pHwnd = FindWindowEx(pHwnd, 0, "MsoWorkPane", "Ribbon") pHwnd = FindWindowEx(pHwnd, 0, "NUIPane", "") pHwnd = FindWindowEx(pHwnd, 0, "NetUIHWND", "") getHwnd = pHwnd End Function '**** 引用 http://www.ka-net.org/ **** Function GetAcc(myAcc As IAccessible, _ myAccName As String, _ myAccRole As Long _ ) As IAccessible Dim ReturnAcc As IAccessible Dim ChildAcc As IAccessible Dim List() As Variant Dim Count As Long Dim i As Long If (myAcc.accState(CHILDID_SELF) <> 32769) And _ (myAcc.accName(CHILDID_SELF) = myAccName) And _ (myAcc.accRole(CHILDID_SELF) = myAccRole) Then Set ReturnAcc = myAcc Else Count = myAcc.accChildCount If Count > 0& Then ReDim List(Count - 1&) If AccessibleChildren(myAcc, 0&, ByVal Count, List(0), Count) = 0& Then For i = LBound(List) To UBound(List) If TypeOf List(i) Is IAccessible Then Set ChildAcc = List(i) Set ReturnAcc = GetAcc(ChildAcc, myAccName, myAccRole) If Not ReturnAcc Is Nothing Then Exit For End If Next End If End If End If Set GetAcc = ReturnAcc End Function
2 件のコメント:
UIAutomationCore.dllへの参照設定が必要ですが、UI AutomationだとFindFirst やFindAll で検索が可能なので再帰処理より効率的かと思われます。
活動のコンピタンスとしては、
マクロでリボンを最小化する。:初心者備忘録
で、解決でよいかなと。
今となっては、ですけれども。
コメントを投稿