【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触らせてくれないかなぁ。』って思ってます😓
したら、またねぇ✋
ディスカッション
コメント一覧
まだ、コメントがありません