这篇文章主要说明一下,如何利用发送消息使两个 exe 完成通信。这次的 demo 分为两个部分,发送端和接收端。顾名思义分别负责发送消息和接收消息。添加这两个窗体:$ \2 l( }! C9 F/ C. v
发送端代码:
0 F i! N h9 M9 w
- //WM_COPYDATA消息所要求的数据结构
- public struct CopyDataStruct
- {
- public IntPtr dwData;
- public int cbData;
-
- [MarshalAs(UnmanagedType.LPStr)]
-
- public string lpData;
- }
-
- public const int WM_COPYDATA = 0x004A;
-
- //通过窗口的标题来查找窗口的句柄
- [DllImport("User32.dll", EntryPoint = "FindWindow")]
- private static extern int FindWindow(string lpClassName, string lpWindowName);
-
- //在DLL库中的发送消息函数
- [DllImport("User32.dll", EntryPoint = "SendMessage")]
- private static extern int SendMessage
- (
- int hWnd, // 目标窗口的句柄
- int Msg, // 在这里是WM_COPYDATA
- int wParam, // 第一个消息参数
- ref CopyDataStruct lParam // 第二个消息参数
- );
-
- private void button1_Click(object sender, EventArgs e)
- {
- //将文本框中的值, 发送给接收端
- string strURL = txtImpinj.Text;
- CopyDataStruct cds;
- cds.dwData = (IntPtr)1; //这里可以传入一些自定义的数据,但只能是4字节整数
- cds.lpData = strURL; //消息字符串
- cds.cbData = System.Text.Encoding.Default.GetBytes(strURL).Length + 1; //注意,这里的长度是按字节来算的
- SendMessage(FindWindow(null, "接收端"), WM_COPYDATA, 0, ref cds); // 这里要修改成接收窗口的标题“接收端”
- //this.Close();
- }
接收端代码:# m; E L \" b! C
- //WM_COPYDATA消息所要求的数据结构
- public struct CopyDataStruct
- {
- public IntPtr dwData;
- public int cbData;
-
- [MarshalAs(UnmanagedType.LPStr)]
- public string lpData;
- }
-
- private const int WM_COPYDATA = 0x004A;
- //接收消息方法
- protected override void WndProc(ref System.Windows.Forms.Message e)
- {
- if (e.Msg == WM_COPYDATA)
- {
- CopyDataStruct cds = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct));
- textBox1.Text = cds.lpData.ToString(); //将文本信息显示到文本框
- //MessageBox.Show(cds.lpData);
- }
- base.WndProc(ref e);
- }
上面代码只是个 demo 为了说明问题,经常使用的话我们可以将这些方法封装到一个类里面,方便复用。总的来说,这种方法的原理就是,利用 FindWindow 函数通过窗体标题查找出对方的进程,然后取得窗口 Handle,再通过 DLL 库中的SendMessage 函数发送消息给接收端,这样就完成了程序的直接通信。 |