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:
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.
[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
@IInspectable. Merci pour votre indice. –
Vous appelez SendMessageA. Appelez SendMessageW à la place. –