他のアプリの画面部品を検索するには?

解決


ruru  2004-03-08 19:58:43  No: 82498  IP: [192.*.*.*]

WEB上でファイルをダウンロードする際、
開かれる「名前を付けて保存」ダイアログに対して
保存するファイル名をVB上から書き換えたく思います。

  Const WINDOW_NAME As String = "名前を付けて保存"
  Dim hWnd      As Long
  Dim hChild    As Long
  hWnd = FindWindow(vbNullString, WINDOW_NAME)
  If hWnd = 0 Then
     MsgBox "FindWindow 失敗"
     Exit Sub
  End If

  hChild = FindWindowEx(hwnd, 0, "Edit", vbNullString)

  If hChild = 0 Then
     MsgBox "FindWindowEx 失敗"
     Exit Sub
  End If

  'エディットボックスにSendMessage
  SendMessage hChild , EM_REPLACESEL, 0, ByVal tmpString

この方法でエディットボックスを検索しましたが
エディットボックスが見つからず hChild = 0 となってしまいます。

試しに予め開いている「名前を付けて保存」ダイアログに対して
spy++ でエディットボックスを覗き、
取得したウィンドウハンドルに対して GetClassName で変換してみると
"Edit" と変換されていました。
どうもきちんと検索ができていないように見えます。
使い方が悪いのでしょうか?

ちなみにダイアログ中のボタンなどは正常に見つかっています。

編集 削除
Say  2004-03-09 00:35:44  No: 82499  IP: [192.*.*.*]

どうしても見つからないなら、
とりあえず、enum〜で子Window列挙してみるとか。

編集 削除
ruru  2004-03-10 00:18:15  No: 82500  IP: [192.*.*.*]

ありがとうございます。
FindWindowExをやめてEnumChildWindowsを使用してみました。
が検索で引っかかったのはButton,Staticのみで
目的のEditクラスは見つかりませんでした。

画面自体にはコンボボックスやツールバーなどもあるので
それらも引っかかってもよさそうな気もするのですが・・

すみません。環境を書き忘れていました。
VB6SP5 , OS:Win2000 , IE6です。

編集 削除
ruru  2004-03-10 02:19:03  No: 82501  IP: [192.*.*.*]

自己レスです。
今回の目的の[名前を付けて保存]ダイアログのファイル名を入力する
エディットボックスですがFinderSystemというツールで調べた所
ComboBoxEx32 --> ComboBox --> Edit と
深い階層下にあることがわかりました。

以下のようにFindWindowExを3回実施して"Edit"を捕まえる
サンプルを海外で見つけたのでマネしてやってみましたが
まだ捕まえられていません。(ComboBoxEx32 が捕まえられません)
hMsgBox = FindWindow("#32770", "Open")
hComboBox = FindWindowEx(hMsgBox, 0, "ComboBoxEx32", "")
hComboBox2 = FindWindowEx(hComboBox, 0, "ComboBox", "")
hTextBox = FindWindowEx(hComboBox2, 0, "Edit", "")
う〜む。。。

編集 削除
ruru  2004-03-10 03:27:14  No: 82502  IP: [192.*.*.*]

FindWindowEx の変わりにGetWindowを使ったところ
直接Editは捕まえられませんでしたがComboBoxEx32が捕まえられました。

ですので ComboBoxEx32 --> ComboBox --> Editと
3回 GetWindow を実施したところうまくウィンドウハンドルを取得できました。
お騒がせしました。

編集 削除