.Net 设计模式

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接收方程序:


.Net 设计模式_第1张图片

2.3发送方程序:


.Net 设计模式_第2张图片

b.使用SendMessage向另一进程发送WM_COPYDATA消息

1.WM_COPYDATA

WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接收方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据。

这个函数的原型及其要用到的结构如下:


.Net 设计模式_第3张图片

2.具体过程如下:

3.发送方程序:

.Net 设计模式_第4张图片

4.接收方程序:

.Net 设计模式_第5张图片

你可能感兴趣的:(.Net 设计模式)