SendMessageでクリック


WAVE迷い人  2005-05-10 07:29:45  No: 89722

お世話になります。(Windows XP VB6.0)
VBから異なるアプリのあるボタンをクリックしようとSendMessageに挑戦中
ですが・・・。
・異なるアプリのウインドウハンドルの取得はできました。
・そのアプリに対してSendMessageで送信することもできました。
  (具体的にはWM_CLOSEで閉じることだけですが・・・)
そのアプリのボタンをクリックする方法がわかりません。
BM_CLICKまではたどりつきましたが、ボタンが複数あるので、当然ボタン
名などを取得した上でSendMessage(ハンドル,BM_CLICK・・・・)
とするのでしょうが、ボタン名(?)の取得と、その名前(?)をパラメー
タとしてどういって記述するのかわかりません。
随分調べましたが、まずボタンの名前(?)を取得することからはじめるの
でしょうか。
よろしくお願いします。


Say  2005-05-10 08:33:43  No: 89723

BM_CLICKの使い方は、ここか隣(初心者掲示板)で検索すればサンプルが見つかります。

キャプションやクラス名は普通はSpy++などで確認すればいいのですが、
sndrec32.exeの5つのボタンは、すべて同一クラス名で同一キャプション
(というよりキャプションなし)のようですから、
ボタンを特定したかったら、クラス名、キャプション名ではなく
相対位置などで判断する必要があるかと。


pon  2005-05-10 10:07:21  No: 89724

sndrec32.exeの5つのオーナードローボタンは、Control ID
(左端:205 から 右端:209)で区別できる様なので、
GetDlgItem APIでボタンのウィンドウハンドルを得る方法もアリかと。


WAVE迷い人  2005-05-11 05:44:24  No: 89725

Say様、pon様  ご指導ありがとうございます。
以前 SendMessageに挑戦して、挫折しましたが今回はなんとか端っこだけでも
かじりつきたいと汗をかきかき奮闘しております。
pon様のご指導により次のようなテストを行えるようなとこまではたどりついた
んですが・・・・・・。

'*** SNDREC32を起動
Private Sub Command1_Click()
Dim RTN
    RTN = Shell("C:\WINDOWS\System32\SNDREC32.EXE", 1)
End Sub

'*** ウインドハンドルを取得してボタンをクリック
Private Sub Command2_Click()
Dim i   As Integer
Dim Handle      As Long
Dim CMD_handle  As Long

Const BM_CLICK = &HF5

'*** SNDREC32のウインドハンドルを取得
        Handle = FindWindow(vbNullString, "Sound - サウンド レコーダー")
        MsgBox "親ウインドハンドル = " & Handle
        
        CMD_handle = GetDlgItem(Handle, 209)
        MsgBox "コントロールのウインドハンドル = " & CMD_handle
        
        '最右端ボタン(録音)をクリック
        Call SendMessage(CMD_handle, BM_CLICK, 0, 0)
End Sub

それぞれウインドハンドルは取得できたのですが、録音状態にはなりませんでした。

試しに、
'最右端ボタン(録音)をクリック
        Call SendMessage(CMD_handle, BM_CLICK, 0, 0)
        Call SendMessage(CMD_handle, BM_CLICK, 0, 0)
などと冗談めいたことをしてみたところなんとうまく録音状態になりました。
これってなぜなんでしょう。やはりどこかおかしいんでしょうね。

Say様、pon様のおかげで、なんとかここまでたどり着きました。もう少し我慢して
ご指導お願いいたします。


pon  2005-05-11 07:25:24  No: 89726

> それぞれウインドハンドルは取得できたのですが、録音状態にはなりませんでした。

アクティブでないウィンドウにBM_CLICKを送信したためでしょう。
っていうか、これは、Say さんが「BM_CLICKの使い方は、ここか隣(初心者掲示板)で検索すればサンプルが見つかります。」と、既に回答されています。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200212/02120039.txt
そのサンプルに解決策が含まれていますよ。


WAVE迷い人  2005-05-11 07:55:40  No: 89727

pon様ありがとうございました。検索が足りないようでご迷惑をおかけしました。

Const WM_ACTIVATE = &H6
Call SendMessage(Handle, WM_ACTIVATE, 1, 0)
Call SendMessage(CMD_handle, BM_CLICK, 0, 0)
で解決しました。

ちなみに
'--------------------------------------------------------
Private RTN
'--------------------------------------------------------
AppActivate RTN
Call SendMessage(CMD_handle, BM_CLICK, 0, 0)
'--------------------------------------------------------
でもOKでした。

ファイル→名前を付けて保存  までたどり着くのはまだまだなようですが
ガンバッテみます。

'* 子ウィンドウがなくなるまで繰り返す
  Do While hChild <> 0
を参考に努力してみます。

ありがとうございました。
きっとまたお世話になると思いますがよろしくお願いします。


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

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






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