今回は、ちょっと面倒くさいよ。
さて、メモ帳から文字列を取得することにします。いきなり関数を書いてしまいます。 Private Const WM_GETTEXT = &HD '文字列を取得する
'---------------------------------------------------------------
Dim TextBuff() As Byte 'メモ帳の文字列格納バイト配列
'メモ帳の文字列サイズ取得
'サイズが0なら終了
'バッファ確保
'メモ帳からテキスト取得 If ret = 0 Then Exit Function
'ANSI→ UNICODE変換 GetEditboxText = strNullCut(gTextBuff) End Function
'--------------------------------------------------------------- Dim NullCharPos As Integer NullCharPos = InStr(srcStr, Chr$(0))
If NullCharPos = 0 Then strNullCut = Left$(srcStr, NullCharPos - 1)
End Function まず、エディットボックスの文字列のサイズを取得します。取得したら、文字列取得変数を文字サイズ分確保します。次に、文字列を取得します。SendMessage API関数の第3引数は取得する文字列のサイズ(=バイト数)、第4引数は取得文字列を格納する変数のポインタを指定します。何故、文字列変数ではなく、Byte型の変数を使用しているかというと…、実はこの部分はよく分かりません。文字列変数を使用するとうまくいかないので、もしやと思い、Byte型を使用したのであります。おそらく、文字列変数を利用すると、文字列を受け取る過程で ANSI文字 → Unicode文字 のコード変換が行われてデータが変更されてしまうのでしょう。そうであるなら、Byte型変数で直接バイナリデータを受け取った方が良いのです。(←多分) また、dll側では BYTE 型として宣言されているのかもしれません。(←かなり適当) それにしても、 SeneMessage の第4引数(= ByRef As Any型)は使用用途が広く、恐いですね。 データを受け取ったらこっちのものです。あとは文字コード変換をしてあげればおしまいです。念のため、Nullを削除しています。API関数の文字は ANSI 形式、Visual Basic は UNICODE、何とも使いにくいことです。 |