C#进程之间的通信
a.使用SendMessage向另一进程发送WM_KEYDOWN消息
1.进程之间的通讯方式:
* 共享内存(内存映射文件,共享内存DLL,剪切板)
* 命名管道
* 匿名管道
* 发送消息
* socket口,配置文件和注册表来间接实现进程间数据通讯任务
2.发送消息实现进程间通讯前准备
用到的一个windows api函数:
要有此函数,需要添加using System.Runtime.InteropService 命名空间
[DLLImport("User32.dll",EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr IP);
此方法各个参数表示的意义:
wnd:接收消息的窗口的句柄,如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口,被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
msg:指定被发送的消息类型。
wP:消息内容。
IP:指定附加的消息。
2.1SendMessage与PostMessage之间的区别:
SendMessage和PostMessage,这两个函数虽然功能非常相似,都是负责向指定的窗口发送消息,
但是SendMessage()函数发出消息后一直等到接收方消息响应函数处理完之后才能返回,并能够得到返回值,在此期间发送方程序将被阻塞。
SendMessage()后面的语句不能被继续执行,即是说此方法是同步的。
而PostMessage()函数在发出消息后马上返回,其后语句能够被立即执行,但是无法获取接收方的消息处理返回值,即是说此方法是异步的。
2.2接收方程序:
2.3发送方程序:
b.使用SendMessage向另一进程发送WM_COPYDATA消息
1.WM_COPYDATA
WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接收方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据。
这个函数的原型及其要用到的结构如下: