请注意:
A、SendMessage在接收方处理完毕前不会返回,会产生严重阻塞
B、由于使用了非托管内存,要注意进行清理
1、发送方WinForm
public const int WM_COPYDATA = 0x004A;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
public void sendData(String msg, Boolean isUnicode)
{
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds.cbData = (msg.Length + 1) * (isUnicode ? 2:1);
cds.lpData = (isUnicode ? Marshal.StringToCoTaskMemUni(msg) : Marshal.StringToCoTaskMemAnsi(msg));
IntPtr cdsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(cds));
Marshal.StructureToPtr(cds, cdsPtr, false);
IntPtr clientWnd = Win32Helper.GetCurrentWindowHandle();
SendMessage(clientWnd, WM_COPYDATA, IntPtr.Zero, cdsPtr);
Marshal.FreeHGlobal(cdsPtr);
Marshal.FreeCoTaskMem(cds.lpData);
}
2、接收方WinForm
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public string lpData;
}
public const int WM_COPYDATA = 0x004A;
protected override void WndProc(ref System.Windows.Forms.Message msg)
{
string msgTxt = "";
COPYDATASTRUCT cds = new COPYDATASTRUCT();
switch (msg.Msg)
{
case WM_COPYDATA:
if(msg.LParam!=IntPtr.Zero)
{
cds = (COPYDATASTRUCT)msg.GetLParam(cds.GetType());
String msgstr = cds.lpData;
//MessageBox.Show(msgstr);
}
break;
default:
base.WndProc(ref msg);
break;
}
}