VB.NET 两个独立的exe互发字符串消息
时间: 2023-11-27 12:50:55 浏览: 38
要实现两个独立的exe之间互相发送字符串消息,可以使用 Windows API 中的 SendMessage 和 PostMessage 函数。下面是一个简单的示例代码:
在第一个exe中:
```vb.net
Public Class Form1
Private Const WM_COPYDATA As Integer = &H4A
<StructLayout(LayoutKind.Sequential)>
Public Structure COPYDATASTRUCT
Public dwData As IntPtr
Public cbData As Integer
Public lpData As IntPtr
End Structure
<DllImport("User32.dll", EntryPoint:="SendMessage")>
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByRef lParam As COPYDATASTRUCT) As IntPtr
End Function
Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
Dim targetExeName As String = "SecondExe.exe"
Dim targetWindowName As String = "Form1"
Dim hwnd As IntPtr = FindWindow(Nothing, targetWindowName)
If hwnd <> IntPtr.Zero Then
Dim data As New COPYDATASTRUCT
data.dwData = IntPtr.Zero
data.cbData = txtMessage.Text.Length * 2 ' 字符串长度
data.lpData = Marshal.StringToHGlobalUni(txtMessage.Text)
SendMessage(hwnd, WM_COPYDATA, Me.Handle, data)
Marshal.FreeHGlobal(data.lpData)
Else
MessageBox.Show("无法找到目标窗口!")
End If
End Sub
End Class
```
在第二个exe中:
```vb.net
Public Class Form1
Private Const WM_COPYDATA As Integer = &H4A
<StructLayout(LayoutKind.Sequential)>
Public Structure COPYDATASTRUCT
Public dwData As IntPtr
Public cbData As Integer
Public lpData As IntPtr
End Structure
<DllImport("User32.dll", EntryPoint:="SendMessage")>
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByRef lParam As COPYDATASTRUCT) As IntPtr
End Function
<DllImport("User32.dll", EntryPoint:="PostMessage")>
Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByRef lParam As COPYDATASTRUCT) As IntPtr
End Function
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = WM_COPYDATA Then
Dim data As COPYDATASTRUCT
data = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(COPYDATASTRUCT)), COPYDATASTRUCT)
Dim message As String = Marshal.PtrToStringUni(data.lpData, data.cbData \ 2)
MessageBox.Show("接收到消息:" & message)
Else
MyBase.WndProc(m)
End If
End Sub
End Class
```
在第一个exe中,点击发送按钮后,程序会尝试找到第二个exe的窗口,并发送消息。在第二个exe中,当接收到消息时,会弹出一个消息框显示接收到的字符串。需要注意的是,这里使用的是 SendMessage 函数,它会阻塞当前线程,直到消息被处理。如果想要异步发送消息,可以使用 PostMessage 函数。