我在VB.NET中有一个服务器应用程序,它试图将文本消息发送到客户端应用程序窗口中的文本框,用经典VB编写(我无法控制客户端代码)。我正在使用IPC,特别是“SendMessageTimeout”PInvoke。
我想将“Hello World”发送到客户端的文本框中。当我运行应用程序时,它发送“H”(但不发送“ello World”)。如果我将消息更改为“Test 1-2-3”,则会发送“T”(但不是“est 1-2-3”)。
如何发送整条信息?
下面的代码(“lParam”是我要发送的字符串):
Private Function fSendString(ByVal hwnd As IntPtr, ByVal uMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
Try
Dim lResult As IntPtr
Dim GCH As GCHandle = GCHandle.Alloc(lParam, GCHandleType.Pinned)
Dim pS As IntPtr = GCH.AddrOfPinnedObject
If SendMessageTimeout(hwnd, uMsg, wParam, pS, 0, 25, lResult) Then
'If this function returns true, the result holds the return value.
fSendString = lResult
End If
GCH.Free()
Catch ex As Exception
MsgBox("fSendString(): " & ex.ToString)
fSendString = Nothing
End Try
Return fSendString
End Function
就应用程序而言,一切运行正常 - 完全没有错误。但显然它不起作用。 :)
答案 0 :(得分:1)
我找到了答案。显然通过GCHandle.Alloc固定它,然后获取GCHandle的IntPtr是问题的原因。我通过替换以下行来解决它:
Dim GCH As GCHandle = GCHandle.Alloc(lParam, GCHandleType.Pinned)
Dim pS As IntPtr = GCH.AddrOfPinnedObject
使用:
Dim pS As IntPtr = Marshal.StringToHGlobalAnsi(lParam)
执行此操作后,字符串完全传递到客户端窗口的文本框中。