こんにちわ。ともです。
以下の内容をご存知の方、教えていただけませんか?
VBから別アプリのウィンドウ上の「実行」ボタンをクリックする方法
を教えてください。
SendKeysは使わないようにしたいので
FindWindowでウィンドウのハンドルを取得して
「実行」ボタンにWM_COMMANDメッセージか何かを送って
実現したいのですが・・・
FindWindowまではOKなんですが、
「実行」ボタンをどうやって特定するかが問題です。
よろしくお願いします
基本的には、次のような感じかな。
API の宣言、定数の宣言は省いています。
Private Sub Command1_Click()
Const WINDOW_NAME As String = "XYZ" '* フォームのキャプション
Const BUTTON_NAME As String = "実行" '* ボタンのキャプション
Dim hWnd As Long
Dim hChild As Long
Dim sWndText As String
Dim lRet As Long
'* ウィンドウを取得
hWnd = FindWindow(vbNullString, WINDOW_NAME)
'* ウィンドウがない場合は、終了
If hWnd = 0 Then Exit Sub
'* 子ウィンドウを取得
hChild = GetWindow(hWnd, GW_CHILD)
'* 子ウィンドウがなくなるまで繰り返す
Do While hChild <> 0
'* ウィンドウのテキストを取得
sWndText = Space(256)
lRet = GetWindowText(hChild, sWndText, Len(sWndText))
If lRet = 0 Then GoTo L_NEXT
lRet = InStr(sWndText, vbNullChar)
If lRet = 0 Then GoTo L_NEXT
sWndText = Trim(Left(sWndText, lRet - 1))
'* 現在の子ウィンドウが対象のものでなければ、次へ
If sWndText <> BUTTON_NAME Then GoTo L_NEXT
'* 現在の子ウィンドウをアクティブに設定
' (設定しないと次の BM_CLICK メッセージが無視される場合がある)
SendMessage hChild, WM_ACTIVATE, 1, ByVal 0&
'* 現在の子ウィンドウにクリックメッセージを送信
SendMessage hChild, BM_CLICK, 0, ByVal 0&
L_NEXT:
'* 弟ウィンドウを取得
hChild = GetWindow(hChild, GW_HWNDNEXT)
Loop
End Sub
> '* 子ウィンドウを取得
以下は,FindWindowEx使った方が効率がよいですね。
FindWindowEx ...
試しに改良してみました。
ホントに簡単になってしまいましたね。
コードもすっきり!
Private Sub Command1_Click()
Const WINDOW_NAME As String = "XYZ"
Const BUTTON_NAME As String = "実行"
Dim hWnd As Long
Dim hChild As Long
hWnd = FindWindow(vbNullString, WINDOW_NAME)
If hWnd = 0 Then Exit Sub
hChild = FindWindowEx(hWnd, 0, vbNullString, BUTTON_NAME)
If hChild = 0 Then Exit Sub
SendMessage hChild, WM_ACTIVATE, 1, ByVal 0&
SendMessage hChild, BM_CLICK, 0, ByVal 0&
End Sub
# FindWindow も FindWindowEx で置き換えることができますね。
ともです。
皆さんのご指導で無事解決しました〜!(^_^)/~
ありがとうございます。
ツイート | ![]() |