windows7のエクスプローラをVBAで操作-3
アドバイスをお願いします。
Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。
WindowsXPのときはできていたのですが、Windows7になったらエクスプローラが変わったため正しく動作しなくなりました。
やりたいのはエクスプローラに検索文字列(添付ファイル参照)をセットして検索をさせたいのです。
「windows7のエクスプローラをVBAで操作-1」「windows7のエクスプローラをVBAで操作-2」のタイトルで質問させていただき、下のコードを考えましたが、★のところでハンドルが返らず0でした。InspectObjectsで見ると「読み込み専用」と。これが原因ですか?どうしたらいいのだろう・・・。
またこのハンドルを取得して、AccessibleObjectFromWindowでIAccessible を取り出して、accDoDefaultActionしたいのですが、UUIDの値が分かりません。OLEViewで見たのですがExplorer関連がいくつかあり(添付ファイル参照)どれを使っていいものやら。ボタンクリックの後に文字列セットがあるのですが、まだたどり着けず。
IAccessible初心者です。
質問ばかりで済みませんがコーディングのアドバイスお願いします。
Option Explicit
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function AccessibleObjectFromWindow Lib "oleacc" _
(ByVal hWnd As Long, _
ByVal dwObjectID As Long, _
ByRef riid As Any, _
ByRef ppvObject As Any) As Long
Const WM_SETTEXT = &HC '文字列送信
Const BM_CLICK = &HF5 'クリック
Const OBJID_CLIENT As Integer = &HFFFFFFFC
Private Type UUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type
Private IID_IAccessible As UUID
Private oShell
Private ie
Private hWnd As Long
Private SearchBoxハンドル As Long
Private Search_Folder As String
Private RC As Long
'Private objAcc As IAccessible
Private objAcc As UUID
Private varChild As Variant
Private cnt
Private fullnames As String
Sub 検索指定のインプット()
Search_Folder = "c:\xxx"
Set oShell = CreateObject("Shell.Application")
For cnt = oShell.Windows().Count - 1 To 0 Step -1
' On Error Resume Next
Set ie = oShell.Windows().Item(cnt)
fullnames = ie.FullName
' On Error GoTo 0
If fullnames = "C:\Windows\Explorer.EXE" Then
ie.Navigate (Search_Folder)
hWnd = FindWindow("CabinetWClass", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "WorkerW", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "ReBarWindow32", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "UniversalSearchBand", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "Search Box", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "SearchEditBoxWrapperClass", vbNullString)
hWnd = FindWindowEx(hWnd, 0, "SearchBox", vbNullString) ' ★--> 0 return
SearchBoxハンドル = hWnd
hWnd = FindWindowEx(SearchBoxハンドル, 0, "Button", "検索")
hWnd = FindWindowEx(SearchBoxハンドル, 0, "SearchEditBox", vbNullString)
' "SearchEditBox" に検索文字列入力の予定だった
With IID_IAccessible
.Data1 = &H68284FAA
.Data2 = &H6A48
.Data3 = &H11D0
.Data4(0) = &H8C
.Data4(1) = &H78
.Data4(2) = &H0
.Data4(3) = &HC0
.Data4(4) = &H4F
.Data4(5) = &HD9
.Data4(6) = &H18
.Data4(7) = &HB4
End With
RC = AccessibleObjectFromWindow(hWnd, OBJID_CLIENT, IID_IAccessible, objAcc)
' 80004005が返る
varChild = 2 ' Class="Button", Name="検索"のコントロールをクリックしたいが・・・
' RC = objAcc.accDoDefaultAction(varChild) ' 書き方が違うみたい・・・
' Class="SearchEditBox" に検索する文字列を入れたいが・・・
Exit Sub
End If
Set ie = Nothing
Next
End Sub
お礼
ご回答有難うございます (Declareが出鱈)の一文のおかげで解決しました。 >であれば、Win APIではなく.NETの勉強をしましょう。 ごもっとも しかしながらこれが今出されている課題なのでご質問させていただきました。 なお、以下のページを参考にしました http://akademeia.info/index.php?VB.NET%2F%A5%C6%A5%AF%A5%CB%A5%C3%A5%AF%2FWin32API%A4%CE%CD%F8%CD%D1 じぶんの英語スキルは酷過ぎるので教えていただいた所有名どころみたいですが さっぱり読めませんでしたm(_ _)m