C# 两个独立exe程序直接通信

网友投稿 789 2022-11-19

C# 两个独立exe程序直接通信

C# 两个独立exe程序直接通信

两个独立的 exe 程序之间如何完成通信呢?首先想到的办法是利用生成文件的方法,即,发送端在某个目录下生成一个文件,包含要发送的消息,接收端从这个目录中读取文件且获取消息。这个方法也能实现通信,但是总感觉有点多此一举。能不能让两个 exe 程序直接进行通信,发送消息呢?

答案是肯定的!而且还有好几种方法。

1、发送消息传递

2、共享内存传递

3、使用COM进程外服务器 ...

这篇文章主要说明一下,如何利用发送消息使两个 exe 完成通信。这次的 demo 分为两个部分,发送端和接收端。顾名思义分别负责发送消息和接收消息。添加这两个窗体:

发送端代码:

//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();}

接收端代码:

//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 函数发送消息给接收端,这样就完成了程序的直接通信。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C#实现网页加载后将页面截取成长图片 | Playwright版
下一篇:Qt添加资源文件,为QAction添加图标,建立信号槽函数并实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~