SENDMESSAGE関数で文字を取得したのですが少しおかしい

解決


うた  2006-05-21 19:54:42  No: 131514

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 の長さの空白文字列を用意しなければならないの
でしょうか。分かる方がいましたら教えて下さい。


うた  2006-05-21 19:56:50  No: 131515

少し修正します。

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  2006-05-21 20:38:09  No: 131516

終端文字のせいでしょう。


うた  2006-05-22 06:59:42  No: 131517

Say様ご回答有難う御座います。
>終端文字のせいでしょう。
これはどういうことでしょうか。NAMEに何か文字列が付加されているのでしょ
うか。また、そうだとしたら、何処で付加されているのでしょうか。
NAMEをクリップボードで取得して、バイナリエディタで見ましたが、
何も無いようです。あと、その終端文字のせいで、MsgBox "0" & Right(NAME, 2) & "0"、こうした場合、後半の0がきえるとの事でしょうか。
その終端文字は、具体的に何でしょうか。

恐縮ですが、宜しくお願いします。


QA  2006-05-22 09:20:24  No: 131518

APIを正しく使うには少しC言語の知識が必要になってきます。

C言語の文字列はNullコード(&H00)で文字列の終端を表現しています。
つまりある文字列を格納するのに必要なメモリは文字列の長さ+終端文字(1バイト)
の領域が、その文字列を格納するために必要となります。

でなぜそこから後がメッセージボックスで表示されなくなるかというと
前でも書いた通りNullコードがメッセージの終端とみなされるためです。

試してみたければ下記のコードで試してみて下さい。
MsgBox "ABCD" & Chr$(0) & "EFG"


うた  2006-05-22 18:53:29  No: 131519

>C言語の文字列はNullコード(&H00)で文字列の終端を表現しています。
>つまりある文字列を格納するのに必要なメモリは文字列の長さ+終端文字(1バイ>ト)
>の領域が、その文字列を格納するために必要となります。

>でなぜそこから後がメッセージボックスで表示されなくなるかというと
>前でも書いた通りNullコードがメッセージの終端とみなされるためです。

QA様有難う御座いました。なるほど、Nullコード(&H00)が正体だったのですね。
お蔭様で疑問が解けました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加