假设我有两个用 vb.NET 编写的 Windows 窗体应用程序,App1 和 App2。App1 和 2 是两个完全分离的解决方案。
是否可以在 App1 中共享一个面板(或另一个容器),以便 App2 可以控制该面板的内容?通过控制内容,我的意思是添加将在 App2 中触发事件的文本框和按钮。
假设我有两个用 vb.NET 编写的 Windows 窗体应用程序,App1 和 App2。App1 和 2 是两个完全分离的解决方案。
是否可以在 App1 中共享一个面板(或另一个容器),以便 App2 可以控制该面板的内容?通过控制内容,我的意思是添加将在 App2 中触发事件的文本框和按钮。
我们以前在我的企业中履行过这项职责,我们使用一些 WinAPI 在 Windows 之间进行通信:
您必须 DLLImport 以下 user32.dll 函数:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As IntPtr) As Integer
您使用 App1 中的 SendMessage 函数将消息发送到 App2。
您可以在 App2 应用程序中收听覆盖 WndProc Sub 的 Window 消息:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_COPYDATA Then
'Read the message and perform some task,
'Create textboxes, modify controls, whatever
Else
MyBase.WndProc(m)
End If
End Sub
通过应用程序 1发送窗口消息的示例如下:
Dim hWnd As IntPtr
Dim mCopyData As COPYDATASTRUCT
hWnd = FindWindow(Nothing, App2WindowName)
Dim message As New System.Text.StringBuilder
If (hWnd <> 0) Then
message.Append(Mensaje)
Dim pCopyData As IntPtr = Marshal.AllocHGlobal(message.Length() + 40)
mCopyData.lpData = Marshal.StringToHGlobalAnsi(message.ToString)
mCopyData.cbData = message.Length
mCopyData.dwData = _messageID
Marshal.StructureToPtr(mCopyData, pCopyData, False)
SendMessage(hWnd, WM_COPYDATA, sender.Handle, pCopyData)
Marshal.FreeHGlobal(mCopyData.lpData)
Marshal.FreeHGlobal(pCopyData)
End If
您需要在代码中声明 COPYDATASTRUCT 才能使用 winapi:
<StructLayout(LayoutKind.Sequential)> _
Private Structure COPYDATASTRUCT
Public dwData As IntPtr
Public cbData As Integer
Public lpData As IntPtr
End Structure
和 WM_COPYDATE 消息整数:
Const WM_COPYDATA As Integer = 74