之前一直的postmessage方法来实现进程间的通信,但是只是发送一个信号而已,具体的内容通过读写文件来实现,所以闲来无事看看sendmessage方法的用法。
发送端代码:
//Win32 API函数:
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int msg, uint wParam, ref COPYDATASTRUCT lParam);
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
const int WM_COPYDATA = 0x004A;
public Form1()
{
InitializeComponent();
}
private void btnSendData_Click(object sender, EventArgs e)
{
int WINDOW_HANDLER = FindWindow(null, @"接收数据");
if (WINDOW_HANDLER != 0)
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(this.tbxSendData.Text);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)100;
cds.lpData = this.tbxSendData.Text;
cds.cbData = len + 1;
int sendRet = SendMessage((IntPtr)WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
if (sendRet != 0)
{
MessageBox.Show("传递参数失败!");
}
}
else
MessageBox.Show("目标窗口没有运行!");
}
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
接收端代码:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
this.tbxRecData.Text = mystr.lpData;
//MessageBox.Show();
break;
default:
base.DefWndProc(ref m);
break;
}
}
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
在这个方法中,可以将结构体COPYDATASTRUCT发送给指定的窗口,具体细节还需要在研究一下。