チャットルームからテキストを取得します。これを行うには、Marshalクラスを使用して文字列ポインタを取得し、Marshal.PtrToStringUniを使用して文字列に変換し直します。私のターゲット文字列はベトナム語(UTF-8、コードページWindows-1258)で書かれています。そして私はそれが正しく表示されることができませんでした(結果は奇妙な中国語と記号を示しています)。それを正しくするには、以下のコードで何を変更する必要がありますか?ありがとう〜ここ外部アプリケーションからnon-ansi文字列を取得する方法は正しく表示されますか?
'API Declaration
Declare Auto Function SendMessage Lib "user32.dll"(ByVal hWnd As IntPtr, ByVal msg As Integer, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Declare Auto Function FindWindow Lib "user32.dll" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
'Sub to get chat room text
' I already got the handle of the chat text area (RoomText)
Private Sub GetText()
'get text length
length = SendMessage(RoomText, WM_GETTEXTLENGTH, 0, 0) + 1
'Alloc memory for the buffer that receives the text
Dim Handle As IntPtr = Marshal.AllocHGlobal(length)
'send WM_GETTEXT message to the chat window
Dim NumText As Integer = SendMessage(Hwnd, WM_GETTEXT, length, Handle)
'copy the characters from the unmanaged memory to a managed string
Dim Text As String = Marshal.PtrToStringUni(Handle)
'Display the string using a textbox
TextBox1.AppendText(Text)
End Sub
P/S:他の努力で、私はSendMessageW、およびSendMessageA機能を試してみました、そして唯一のSendMessageAは、文字列を結果英語と疑問符(ng?y de?p ...のようなもの)が混在しています。 SendMessageWは奇妙な文字を返します。
[MultiByteToWideChar](https://msdn.microsoft.com/en-us/library/windows/desktop/dd319072.aspx)。理由を理解するには、[すべてのソフトウェア開発者が絶対に最低限必要な、絶対確実なUnicodeと文字セットについて知っておく必要があります(言い訳はありません)]を読んでください(https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum - ソフトウェアデベロッパー - 絶対に - 積極的に - ユニコードとキャラクターセットについて - 知っておかなければならない - 言い訳なし)。 – IInspectable
@IInspectable。あなたのヒントありがとうございます。 –
SendMessageAを呼び出しています。代わりにSendMessageWを呼び出します。 –