お世話になります。(Windows XP VB6.0)
VBから異なるアプリのあるボタンをクリックしようとSendMessageに挑戦中
ですが・・・。
・異なるアプリのウインドウハンドルの取得はできました。
・そのアプリに対してSendMessageで送信することもできました。
(具体的にはWM_CLOSEで閉じることだけですが・・・)
そのアプリのボタンをクリックする方法がわかりません。
BM_CLICKまではたどりつきましたが、ボタンが複数あるので、当然ボタン
名などを取得した上でSendMessage(ハンドル,BM_CLICK・・・・)
とするのでしょうが、ボタン名(?)の取得と、その名前(?)をパラメー
タとしてどういって記述するのかわかりません。
随分調べましたが、まずボタンの名前(?)を取得することからはじめるの
でしょうか。
よろしくお願いします。
BM_CLICKの使い方は、ここか隣(初心者掲示板)で検索すればサンプルが見つかります。
キャプションやクラス名は普通はSpy++などで確認すればいいのですが、
sndrec32.exeの5つのボタンは、すべて同一クラス名で同一キャプション
(というよりキャプションなし)のようですから、
ボタンを特定したかったら、クラス名、キャプション名ではなく
相対位置などで判断する必要があるかと。
sndrec32.exeの5つのオーナードローボタンは、Control ID
(左端:205 から 右端:209)で区別できる様なので、
GetDlgItem APIでボタンのウィンドウハンドルを得る方法もアリかと。
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様のおかげで、なんとかここまでたどり着きました。もう少し我慢して
ご指導お願いいたします。
> それぞれウインドハンドルは取得できたのですが、録音状態にはなりませんでした。
アクティブでないウィンドウにBM_CLICKを送信したためでしょう。
っていうか、これは、Say さんが「BM_CLICKの使い方は、ここか隣(初心者掲示板)で検索すればサンプルが見つかります。」と、既に回答されています。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200212/02120039.txt
そのサンプルに解決策が含まれていますよ。
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
を参考に努力してみます。
ありがとうございました。
きっとまたお世話になると思いますがよろしくお願いします。
ツイート | ![]() |