GetWindowText/GetDlgItemTextを使うときには事前にGetWindowTextLengthを使って文字列の長さを求めておき、
mallocなりZeroStringなりでメモリを確保する必要があり、面倒だったり混乱を招いたりしていました。
そこで直接String型へ書き込む関数GetWindowTextStr/GetDlgItemStrなるものを作りました。
どなたか既に書いていたような気がしなくもないのですが、検索しても見つからなかったので投稿しておきます。
たとえばこういう感じに使います。(MainWndがあり、その上にボタン(ID:CommandButton1)とエディットボックス(ID:EditBox1)があるとします)
ボタンを押すとエディットボックスに書かれている内容がメッセージボックスに表示されると言うものです。
コード:
Sub MainWnd_CommandButton1_Click()
Dim str As String
GetGetDlgItemTextStr(hMainWnd, EditBox1, str)
MessageBox(hMainWnd, StrPtr(str), "エディットボックスの内容", MB_OK)
End Sub
GetWindowText/GetDlgItemTextでは文字列のバッファへのポインタとバッファのサイズという2つの引数を指定していましたが、
その代わりに直接String型の変数を指定できるようになっています。
戻り値はGetWindowText/GetDlgItemTextと同じです。(文字列の長さ)
↓使うときにはこれをコピーしてください。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード:
Function GetWindowTextStr(hwnd As HWND, ByRef str As String) As Long
Dim Length As Long
Length = GetWindowTextLength(hwnd)
str = ZeroString(Length)
If Length = 0 Then
GetWindowTextStr = 0
Exit Function
End If
GetWindowTextStr = GetWindowText(hwnd, StrPtr(str), Length + 1)
SetDWord(StrPtr(str) - SizeOf (DWord), GetWindowTextStr)
End Function
Function GetDlgItemTextStr(hDlg As HWND, idDlgItem As Long, ByRef str As String) As Long
GetDlgItemTextStr = GetWindowTextStr(GetDlgItem(hDlg, idDlgItem), str)
End Function
H17.11.27
文字列の長さをGetWindowTextの返す値を見て設定するように修正いたしました。