VBAからIE9のタブ機能を操作しようと悪戦苦闘しております。
詳しく申し上げると、最前面に表示されているIEの
アクティブなタブを確実につかんだうえで、
そのページのDOMを操作したいです。
色々調べていったところ、IAccessibleインタフェースの
中にあるaccStateプロパティを見れば、タブがアクティブになっているかどうか
判別できるところまでたどり着きました。
以下のページを参考にしました。
http://mt-soft.sakura.ne.jp/kyozai/excel_apps/tab-ctrl/index-jump.html?pg_02.html
※C#を多少かじったので、クラス等の知識は微量ですがあります。
上記のサイトを参考に実際にコードを組んでいたのですが、
AccessibleオブジェクトとIEオブジェクトを行き来する方法が
わからず、せっかくタブの状態がわかっても
それをメインのコードに反映することができません。
Accessibleオブジェクトの階層を上のほうまで辿って行けば、
IEオブジェクト(Shell Windowオブジェクト?)にたどり着く?
ということも考えたのですが、辿り方がわからず頓挫しております。
最前面のIEはFindWindow関数でハンドルを取得し、
それをAccessibleインターフェイスに渡す方法で
accStateを取得しています。
Sub ie_find()
Dim IE As Object
Dim hWnd As Double
hWnd = FindWindow("IEFrame", vbNullString)
'タブのリスト
Dim TabList()
'タブリスト作成
MakeTabList hWnd, TabList
For i = 0 To UBound(TabList)
If TabList(i).accState(CHILDID_SELF) = 2097154 Then
Next i
’ここにいれる処理がわかりません。
’IEオブジェクト⇔Accessibleオブジェクトの
’方法があれば処理できると思います。
End Sub
Private Sub MakeTabList(hWnd As Double, ByRef TabList())
'
' タブ一覧生成
'
Dim hWndChild As Long
Dim Cnt As Long, i As Long
Dim ClassName As String
Call Class_Initialize 'AccessibleオブジェクトのUUID設定
hWndChild = GetDirectUIHWND(hWnd, "CommandBarClass") 'IE9以前
If hWndChild = 0 Then hWndChild = GetDirectUIHWND(hWnd, "WorkerW") 'IE10以降
If hWndChild = 0 Then Exit Sub
Dim objAcc As IAccessible, v
AccessibleObjectFromWindow hWndChild, OBJID_CLIENT, IID_IAccessible, objAcc
If Not (objAcc Is Nothing) Then
Dim Children() As Variant
Dim Count1 As Long, Count2 As Long
Dim retCount As Long
Count1 = objAcc.accChildCount
ReDim Children(Count1 - 1)
Call AccessibleChildren(objAcc, 0, Count1, Children(0), retCount) '子オブジェクト
For i = 0 To objAcc.accChildCount - 1
If TypeOf Children(i) Is IAccessible Then
If Children(i).accRole(CHILDID_SELF) = ROLE_SYSTEM_PAGETABLIST Then 'タブ行?
Count2 = Children(i).accChildCount
ReDim TabList(Count2 - 1)
'タブの一覧を生成 「タブ」と「新しいタブ」のボタン
Call AccessibleChildren(Children(i), 0&, ByVal Count2, TabList(0), retCount)
Exit For
End If
End If
Next i
End If
End Sub
Private Function GetDirectUIHWND(hWnd As Double, ClassName As String) As Long
'
' DirectUIHWND のウィンドウハンドルを取得
'
Dim hWndChild As Long
hWndChild = FindWindowEx(hWnd, 0, ClassName, vbNullString)
If hWndChild <> 0 Then hWndChild = FindWindowEx(hWndChild, 0, "ReBarWindow32", vbNullString)
If hWndChild <> 0 Then hWndChild = FindWindowEx(hWndChild, 0, "TabBandClass", vbNullString)
If hWndChild <> 0 Then hWndChild = FindWindowEx(hWndChild, 0, "DirectUIHWND", vbNullString)
GetDirectUIHWND = hWndChild
End Function
Private Sub Class_Initialize()
'AccessibleオブジェクトのUUID設定
With IID_IAccessible
.Data1 = &H618736E0
.Data2 = &H3C3D
.Data3 = &H11CF
.Data4(0) = &H81
.Data4(1) = &HC
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H38
.Data4(6) = &H9B
.Data4(7) = &H71
End With
End Sub
どうかこの辺詳しい方、ご教示よろしくお願いいたします。
お礼
本当にありがとうございました!! 数ヶ月悩んでいたことがついに解決しました! 感謝です!