VB6.0。
宜しくお願いします。今メモ帳のEDITウィンドウの文字列をSENDMESSAGE関数を使用して下記のように取得しています。
Private Sub Timer2_Timer()
Dim NAME As String ' 文字列を受け取るバッファ
Dim lenResult As Long ' バッファの長さ
Dim clt As Long
Dim Position As Integer
Dim i As Integer
Dim StrA As String
Dim Order As Byte
'メモ帳のハンドル取得
Dim hwindow As Long
'hwindow = FindWindow(vbNullString, "無題 - メモ帳")
If hwindow <> 0 Then
hwindow = FindWindowEx(hwindow, 0&, "edit", vbNullString)
End If
End Sub
' コマンドラインの文字列の長さ
lenResult = SendMessage(hwindow, WM_GETTEXTLENGTH, 0, 0&)
' 文字列 +1 の長さの空白文字列を用意
NAME = Space(lenResult + 1)
' SendMessage を使って文字を得る
clt = SendMessageString(hwindow, WM_GETTEXT, lenResult + 1, NAME)
MsgBox "0" & Right(NAME, 1) & "0"
メモ帳にaと文字を入力すると、上記の場合、何も返りません。Right(NAME, 2)
とすると、aが返りますが、Right関数は文字数で取得するのだと思いましたが
どうしてでしょう。それと、MsgBox "0" & Right(NAME, 2) & "0"は、結果
0a0と返すと思うのですが、2番目の0が返りません。メモ帳にどんな文字を
入力したのかに関わらず、2番目の0が返りません。摩訶不思議です。
それと恐縮ですが、
' 文字列 +1 の長さの空白文字列を用意
NAME = Space(lenResult + 1)
はどういう理由で文字列 +1 の長さの空白文字列を用意しなければならないの
でしょうか。分かる方がいましたら教えて下さい。
少し修正します。
VB6.0。
宜しくお願いします。今メモ帳のEDITウィンドウの文字列をSENDMESSAGE関数を使用して下記のように取得しています。
Private Sub Timer2_Timer()
Dim NAME As String ' 文字列を受け取るバッファ
Dim lenResult As Long ' バッファの長さ
Dim clt As Long
Dim Position As Integer
Dim i As Integer
Dim StrA As String
Dim Order As Byte
'メモ帳のハンドル取得
Dim hwindow As Long
hwindow = FindWindow(vbNullString, "無題 - メモ帳")
If hwindow <> 0 Then
hwindow = FindWindowEx(hwindow, 0&, "edit", vbNullString)
End If
' コマンドラインの文字列の長さ
lenResult = SendMessage(hwindow, WM_GETTEXTLENGTH, 0, 0&)
' 文字列 +1 の長さの空白文字列を用意
NAME = Space(lenResult + 1)
' SendMessage を使って文字を得る
clt = SendMessageString(hwindow, WM_GETTEXT, lenResult + 1, NAME)
MsgBox "0" & Right(NAME, 1) & "0"
End Sub
メモ帳にaと文字を入力すると、上記の場合、何も返りません。Right(NAME, 2)
とすると、aが返りますが、Right関数は文字数で取得するのだと思いましたが
どうしてでしょう。それと、MsgBox "0" & Right(NAME, 2) & "0"は、結果
0a0と返すと思うのですが、2番目の0が返りません。メモ帳にどんな文字を
入力したのかに関わらず、2番目の0が返りません。摩訶不思議です。
それと恐縮ですが、
' 文字列 +1 の長さの空白文字列を用意
NAME = Space(lenResult + 1)
はどういう理由で文字列 +1 の長さの空白文字列を用意しなければならないの
でしょうか。分かる方がいましたら教えて下さい。
終端文字のせいでしょう。
Say様ご回答有難う御座います。
>終端文字のせいでしょう。
これはどういうことでしょうか。NAMEに何か文字列が付加されているのでしょ
うか。また、そうだとしたら、何処で付加されているのでしょうか。
NAMEをクリップボードで取得して、バイナリエディタで見ましたが、
何も無いようです。あと、その終端文字のせいで、MsgBox "0" & Right(NAME, 2) & "0"、こうした場合、後半の0がきえるとの事でしょうか。
その終端文字は、具体的に何でしょうか。
恐縮ですが、宜しくお願いします。
APIを正しく使うには少しC言語の知識が必要になってきます。
C言語の文字列はNullコード(&H00)で文字列の終端を表現しています。
つまりある文字列を格納するのに必要なメモリは文字列の長さ+終端文字(1バイト)
の領域が、その文字列を格納するために必要となります。
でなぜそこから後がメッセージボックスで表示されなくなるかというと
前でも書いた通りNullコードがメッセージの終端とみなされるためです。
試してみたければ下記のコードで試してみて下さい。
MsgBox "ABCD" & Chr$(0) & "EFG"
>C言語の文字列はNullコード(&H00)で文字列の終端を表現しています。
>つまりある文字列を格納するのに必要なメモリは文字列の長さ+終端文字(1バイ>ト)
>の領域が、その文字列を格納するために必要となります。
>でなぜそこから後がメッセージボックスで表示されなくなるかというと
>前でも書いた通りNullコードがメッセージの終端とみなされるためです。
QA様有難う御座いました。なるほど、Nullコード(&H00)が正体だったのですね。
お蔭様で疑問が解けました。
ツイート | ![]() |