2017-08-01 2 views
-1

Je souhaite obtenir le texte d'un salon de discussion. Et pour ce faire, j'utilise la classe Marshal pour obtenir le pointeur de chaîne et le convertir en une chaîne en utilisant Marshal.PtrToStringUni. Ma chaîne cible est écrite en vietnamien (UTF-8, page de code Windows-1258). Et je ne pouvais pas l'afficher correctement (le résultat montre des symboles et des symboles bizarres). Que devrais-je changer dans le code ci-dessous pour bien faire les choses? Merci ~Comment afficher correctement une chaîne non-ansi depuis une application externe?

'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 

Voici le résultat du code ci-dessus: enter image description here

P/S: Dans d'autres efforts, j'ai essayé les fonctions SendMessageW et SendMessageA, et seulement SendMessageA résulte la chaîne avec un mélange d'anglais et de point d'interrogation (quelque chose comme ng? y de? p ...). SendMessageW renvoie des caractères étranges.

+1

[MultiByteToWideChar] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd319072.aspx). Pour comprendre pourquoi, lisez [Le minimum absolu de chaque développeur de logiciels absolument, positivement doit savoir sur Unicode et jeux de caractères (pas d'excuses!)] (Https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum -le-tout-logiciel-développeur-absolument-positivement-doit-savoir-sur-unicode-et-character-sets-no-excuses /). – IInspectable

+0

@IInspectable. Merci pour votre indice. –

+1

Vous appelez SendMessageA. Appelez SendMessageW à la place. –

Répondre

-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

Ceci est la ** mauvaise ** signature. Il va échouer sur Windows 64 bits. Et cela ne résout pas votre problème, car vous n'avez pas analysé votre problème. J'ai peur, cette réponse n'est pas utile. -1. – IInspectable

+0

@IInspectable. Je suis en train de tester ce code sur mes fenêtres 10,64 bits et ça marche. Oui, j'ai mal compris que le texte dans la fenêtre de chat est UTF-8. Quel est votre point de vue sur une manière plus générale d'obtenir le texte? .... En passant, je ne vois aucune chance pour MultiByteToWideChar d'être utile dans ce cas. Ai-je raison? –