一、进程间通信的方式
1)共享内存
包括:内存映射文件、共享内存DLL、剪切板。
2)命名管道和匿名管道
3)消息通信
4)利用代理方法,例如SOCKET、配置文件、注册表方式等。
方法一:通信。
进程间通信的方式多种多样,常用的有共享内存(如内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种直接方式。此外,还可以通过socket接口、配置文件和注册表等来间接实现进程间的数据通信任务。这些方法各有优缺点,具体到需要快速交换大数据量的问题上,则可以排除使用配置文件和注册表的方法;由于管道和socket套接字的使用需要网卡支持,因此也可以不予考虑。这样,可供选择的通信方式只剩下共享内存和发送消息两种。
二、发送消息实现进程间通信的前期准备
下面的例子使用了一个Windows API 32函数:
[DllImport(“User32.dll”, EntryPoint = “SendMessage”)]private static extern int SendMessage(IntPtr wnd, int msg, IntPtr wP, IntPtr lP);
要使用此函数,需要添加using System.Runtime.InteropServices;命名空间。
此方法各个参数的意义如下:
wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
msg:指定被发送的消息类型。
wP:消息内容。
lP:指定附加的消息指定信息。
查阅API参考手册时,关于SendMessage的使用说明提示:
SendMessage与PostMessage之间的区别:SendMessage和PostMessage,这两个函数虽然功能非常相似,都是负责向指定的窗口发送消息,但是SendMessage()函数发出消息后一直等到接收方的消息响应函数处理完之后才能返回,并能够得到返回值,在此期间发送方程序将被阻塞,SendMessage()后面的语句不能被继续执行,即是说此方法是同步的。而PostMessage()函数在发出消息后马上返回,其后语句能够被立即执行,但是无法获取接收方的消息处理返回值,即是说此方法是异步的。
三、发送消息实现进程间通信的具体步骤
1.新建Windows应用程序
(1)打开VS2008,创建一个“Windows应用程序”,主窗口为Form1,项目名称:ProcessCommunication。(2)在Form1上添加一个名为textBox1的文本框,并为Form1添加KeyDown事件,当Form1接收到KeyDown消息时,将接收到的数据显示在textBox1上。
代码语言:javascript代码运行次数:0svg fill=”none” height=”16″ viewbox=”0 0 16 16″ width=”16″ xmlns=”http://www.w3.org/2000/svg”> 运行 复制“`javascript using System;using System.Windows.Forms;namespace ProcessCommunication{ public partial class Form1 : Form { public Form1() { InitializeComponent(); this.KeyDown += new KeyEventHandler(Form1_KeyDown); } private void Form1_KeyDown(object sender, KeyEventArgs e) { //IntPtr p = new IntPtr(e.KeyValue); //string ss = Marshal.PtrToStringAnsi(p); this.textBox1.Text = Convert.ToString(e.KeyValue); //this.textBox1.Text = ss; } }}
3.启动ProcessCommunication.exe可执行文件,弹出Form1窗体,称为接收消息窗体。
启动ProcessCommunication1.exe可执行文件,在弹出的窗体中的文本框中输入任意数字,点击button1按钮,接收消息窗体的textBox1即显示该数字。
至此结束。