アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルVBAから
他のアプリのスクロールバーを操作して、指定範囲で画面スクロールしたいと思っています。

キー入力では操作出来ない(マウス操作でのみスクロールされる)アプリなので、
Sendkeysは使えないのではないかと思い、
APIでハンドルを取得して、
SendMessageすればできるかなと思いましたが、APIについてよく分からないので、
とりあえず、メモ帳で以下を作成してみました。しかし、スクロールされません。
どこがいけないのか教えていただけないでしょうか?
よろしくお願いします。

***************
Public Declare Function FindWindowA Lib "User32" (ByVal cnm As String, ByVal cap As String) As Long
Public Declare Function SendMessage Lib "User32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_VSCROLL = &H115
Public Const WM_HSCROLL = &H114
Public Const SB_TOP = &H6&
Public Const SB_BOTTOM = &H7&

Sub handle_get()
 Dim Handle As Long
 Dim Ap1 As String

 Ap1 = "a.txt - メモ帳"
 AppActivate Ap1
 Handle = FindWindowA(vbNullString, Ap1)
 SendMessage Handle, WM_VSCROLL, SB_BOTTOM, ByVal CLng(0)
 SendMessage Handle, WM_HSCROLL, SB_TOP, ByVal CLng(0)
End Sub
***************

A 回答 (1件)

 こんにちは。


 メモ帳の場合は、アプリケーションのウィンドウの下にエディットボックスコントロールが有り、其処で文字列を受け取っているので、エディットボックスコントロールのハンドルを取ってこないといけません。

 更に上記の事例は、あくまでもメモ帳の場合ですので、操作対象のアプリケーションのウィンドウ構成如何で、取って来るべきハンドルが異なって来ます。
 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …

 後、SB_BOTTOMですと、一気に下までスクロールしてしまうので、SB_LINEDOWNやSB_PAGEDOWN等を使用します。参考程度に。

Public Declare Function FindWindowA Lib "User32" (ByVal cnm As String, ByVal cap As String) As Long
Public Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChild As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Public Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const WM_VSCROLL = &H115
Public Const WM_HSCROLL = &H114
Public Const SB_LINEDOWN = &H1
Public Const SB_TOP = &H6&
Public Const SB_BOTTOM = &H7&

Sub handle_get()
Dim Handle As Long
Dim HandleEdit As Long
Dim Ap1 As String

Ap1 = "a.txt - メモ帳"
AppActivate Ap1
Handle = FindWindowA(vbNullString, Ap1)
HandleEdit = FindWindowEx(Handle, 0, "Edit", vbNullString)

SendMessage HandleEdit, WM_VSCROLL, SB_LINEDOWN, ByVal CLng(0)
SendMessage HandleEdit, WM_HSCROLL, SB_LINEDOWN, ByVal CLng(0)
End Sub
    • good
    • 0
この回答へのお礼

machongolaさま
早速のご回答ありがとうございます!

>エディットボックスコントロールのハンドルを取ってこないといけません

それが足りなかったのですね。やっと分かりました。メモ帳では無事スクロールできました!

ご紹介いただいたリンク先の情報も参照していたのに、
実際の操作対象のアプリだと、FindWindowExを通すと、0が返って来てしまっていたため、削除していました。お手間おかけしました。

実際のアプリでは、キャプション名からウィンドウクラス名も取得してみたりしていたのですが、
意味不明な記号「AX:XXX:・・・」になってしまっていて、取ってきているハンドルが違うのかもしれません。

方向性的にはあっているように思いますので、もう少しトライしてみます。
ありがとうございました!

要件はご回答いただけましたので、この質問は閉じさせていただきます。
ご親切に回答ありがとうございました。
またの機会がありましたらよろしくお願いいたします。

お礼日時:2009/06/25 22:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!