【VBA】SendMessageで文字列を取得

目次

ハンドルの取得

おはろー。早起きは三文の徳と言うけど、長時間寝る体力がなくて朝が早いだけのjimです✋

今回は、『SendMessage』の文字列取得について、記事を書いていきます。

『SendMessage』は、ハンドルに文字列を送ったり受け取ったりできるやーつです。

何で『SendMessage』か?ってーと、派遣先の端末が死んで『サルベージュできなかったソースコード』の中に、ソレを沢山使ったツールがあるっぽいんだよね。

文字列を送るコードは残ってるんだけど、受け取るコード使ってるツールが見つからなくてさ。これはもう、死んだ端末にあるよね😥

だから、次に使う前にブログに載せておけば、楽かなって。。

というか、それ以外にもAPI使ってた気がするんだよねぇ。面倒だわぁ。。。

ってことで、以前にも紹介したハンドルの取得から(ここでもSendMessage使ってるけど文字列送るだけ)。

例えば、以下のメモ帳(親)のEdit(子)を取得するよ。

『*無題 – メモ帳』って名前の親ハンドルを取得して、Editってクラスの子ハンドルを取得します。

あれ?メモ帳の名前にアスタリスクなんて付いたっけ?まあ、いいか。。

コードを記述すると以下のような感じ。

Option Explicit
Private Declare Function FindWindowA Lib "USER32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "User32.dll" Alias "FindWindowExA" _
(ByVal hWndParent As Long, ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Sub a()
Dim hWnd As Long
Dim hWndA As Long
    hWnd = FindWindowA("Notepad", "*無題 - メモ帳")
    hWndA = FindWindowEx(hWnd, 0&, "Edit", vbNullString)
End Sub

 

文字列を取得

次は、メモ帳内の文字列を『SendMessage』で取得していく。

文字列を受け取るバッファ用と、バッファの長さ格納用にLong型の変数を宣言。それから、文字列を受け取る為にString型の変数を宣言します。

んで、文字列の長さを取得し、その長さ+1の空白文字列を用意。

最後に『SendMessage』で文字列を受け取ります。

そうすっと、以下の感じのコードになる。

Dim myLen As Long
Dim myVal As Long
Dim myStr As String
    myLen = SendMessage(hWndA, &HE, 0, 0&)
    myStr = String(myLen + 1, vbNullChar)
    myVal = SendMessage(hWndA, &HD, myLen + 1, myStr)
    Debug.Print myStr

 

まとめ

うーん!ってすると以下のようになります。

Option Explicit
Private Declare Function FindWindowA Lib "USER32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "User32.dll" Alias "FindWindowExA" _
(ByVal hWndParent As Long, ByVal hwndChildAfter As Long, _
ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Sub a()
Dim hWnd As Long
Dim hWndA As Long
Dim myLen As Long
Dim myVal As Long
Dim myStr As String
    hWnd = FindWindowA("Notepad", "*無題 - メモ帳")
    hWndA = FindWindowEx(hWnd, 0&, "Edit", vbNullString)
    myLen = SendMessage(hWndA, &HE, 0, 0&)
    myStr = String(myLen + 1, vbNullChar)
    myVal = SendMessage(hWndA, &HD, myLen + 1, myStr)
    Debug.Print myStr
End Sub

これで、文字列の取得ができます。

でも、実際に自動化する時は、ハンドルの取得が面倒で面倒で。。。

派遣先の『.NETツール』の自動化依頼なんて、「そのツールを改修しろよ!」って感じだし、『もう、DB触らせてくれないかなぁ。』って思ってます😓

したら、またねぇ✋