別アプリを操作するには

解決


とも  2002-12-17 23:56:12  No: 105712

こんにちわ。ともです。
以下の内容をご存知の方、教えていただけませんか?

VBから別アプリのウィンドウ上の「実行」ボタンをクリックする方法
を教えてください。
SendKeysは使わないようにしたいので
FindWindowでウィンドウのハンドルを取得して
「実行」ボタンにWM_COMMANDメッセージか何かを送って
実現したいのですが・・・

FindWindowまではOKなんですが、
「実行」ボタンをどうやって特定するかが問題です。

よろしくお願いします


とろ  2002-12-18 02:05:15  No: 105713

基本的には、次のような感じかな。
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


YuO  2002-12-18 04:12:53  No: 105714

>   '* 子ウィンドウを取得
以下は,FindWindowEx使った方が効率がよいですね。


とろ  2002-12-18 18:18:23  No: 105715

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


とろ  2002-12-18 18:23:36  No: 105716

# FindWindow も FindWindowEx で置き換えることができますね。


とも  2002-12-21 01:11:20  No: 105717

ともです。
皆さんのご指導で無事解決しました〜!(^_^)/~
ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加