重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

アドバイスをお願いします。
Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。
WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。

下のコードはエクスプローラの現在のフォルダパスが表示されるところに(添付ファイル参照)文字を入れるものです。
最後のSendMessageAnyで1が返ってしまいます。何が考えられますでしょうか。どう対策したらいいでしょうか。
なおハンドルの値はSDKのInspect Objectsで確認していますので、正しく取得できていると思っています。
よろしくお願いします。

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
Declare Function SendMessageAny Lib "user32.dll" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal MSG As Long, _
ByVal wParam As Long, _
ByVal lParam As Any) As Long
Const WM_SETTEXT = &HC

Private hwnd As Long
Private FOLDER As String

Sub Put_folder_name1()
hwnd = FindWindow("CabinetWClass", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString)
hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString)
FOLDER = "\\xx.xx.xx.xx\test"
RC = SendMessageAny(hwnd, WM_SETTEXT, 0, ByVal FOLDER)
end sub

「windows7のエクスプローラをVBA」の質問画像

A 回答 (2件)

いや、アドレスバーは ToolbarWindow32 です。


(ちなみに Accessible Explorer で確認しました)

(取り合えず)C++で確認したところ、BM_CLICKでは無理でWM_LBUTTONDOWNなら反応しますが、座標の指定が面倒ですので
子要素のIAccessibleを取得してクリックさせるとか。

ただ、そんな事をしなくとも起動済みのExplorerが対象なら
ShellWindows Collectionで列挙してnavigateメソッドで遷移させればいいのでは。
http://www.moug.net/faq/viewtopic.php?t=68947
(fullnameかtypename等でIEを除外する処理必要)
    • good
    • 0
この回答へのお礼

kumatti1さん
>ShellWindows Collectionで列挙してnavigateメソッドで遷移
うまくいきました。ありがとうございました。
ただ、先があって検索文字列をセットして検索させたいのです。
検索させた後の結果の取り出し部分はできています。
検索文字列セット部分の質問はVisualBasicのカテゴリにて登録しました。(「windows7のエクスプローラをVBAで操作-3」 URL:http://oshiete.goo.ne.jp/qa/8595559.html
引き続きアドバイス戴けたら有難いです。
よろしくお願いします。

お礼日時:2014/05/14 22:48

後続の質問で何でそんな事がしたいのか謎だったのですが、ここで繋がりました。


私も今調べて知ったのですが、デフォルトでは ComboBoxEx32 は非表示になってますね。
エクスプローラのアドレスバーをクリックすると入力が可能になると。

でも、パスを指定して開くのならば
CreateObject("Shell.Application").Explore "C:\"
とかでいいのではと。

この回答への補足

kumatti1さん
回答ありがとうございました。
非表示という状態があるのですね。知りませんでした。
> エクスプローラのアドレスバーをクリックすると
"msctls_progress32"のハンドルでSendMessage(hwnd, BM_CLICK, 0, 0)を
すればいいのですかね?
今、デバッグできる環境でないので明日デバッグしてみます。
  (パスを指定して開くのは用途が違っていましたので、こっちの線で進めます)

あと「windows7のエクスプローラをVBAで操作-2」の方の回答もありがとうございました。
やっぱ、IAccessibleですか。勉強してみます。

補足日時:2014/05/11 09:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!