2017-08-01 11 views
-1

チャットルームからテキストを取得します。これを行うには、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 

は、上記のコードの結果です: enter image description here

P/S:他の努力で、私はSendMessageW、およびSendMessageA機能を試してみました、そして唯一のSendMessageAは、文字列を結果英語と疑問符(ng?y de?p ...のようなもの)が混在しています。 SendMessageWは奇妙な文字を返します。

+1

[MultiByteToWideChar](https://msdn.microsoft.com/en-us/library/windows/desktop/dd319072.aspx)。理由を理解するには、[すべてのソフトウェア開発者が絶対に最低限必要な、絶対確実なUnicodeと文字セットについて知っておく必要があります(言い訳はありません)]を読んでください(https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum - ソフトウェアデベロッパー - 絶対に - 積極的に - ユニコードとキャラクターセットについて - 知っておかなければならない - 言い訳なし)。 – IInspectable

+0

@IInspectable。あなたのヒントありがとうございます。 –

+1

SendMessageAを呼び出しています。代わりにSendMessageWを呼び出します。 –

答えて

-1
'API Declaration 
     Public Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32 
       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 
       'Be noted that Length is the string character count, but Marshal.AllocHGlobal need byte count. 
       'in VB.net string, a character use 2 byte so I put *2 
       Dim Handle As IntPtr = Marshal.AllocHGlobal(length*2) 
       '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 
+1

これは**間違った**署名です。 64ビットWindowsでは失敗します。問題の分析に失敗したため、問題は解決しません。私は恐怖です、この答えは有用ではありません。 -1。 – IInspectable

+0

@IInspectable。私は私の窓10,64ビットでこのコードをテストしています。はい、私はチャットウィンドウのテキストがUTF-8であると誤解しました。もっと一般的な方法でテキストを取得するというあなたの見解は何ですか?...ところで、私はMultiByteToWideCharがこの場合に役立つ可能性はありません。私は正しい? –

関連する問題