admin 管理员组

文章数量: 1184232


2024年3月13日发(作者:重载和重写是什么意思)

c# 进程间通信

一、进程间通讯的方式

进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板

等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过socket口、

配置文件和注册表等来间接实现进程间数据通讯任务。以上这几种方法各有优缺点,具体到

在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;

另外,由于管道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,

可供选择的通讯方式只剩下共享内存和发送消息两种。

二、发送消息实现进程间通讯

在后台代码文件中添加using pServices;命名空间,

pServices提供了相应的类或者方法来支持托管/非托管模块间的

互相调用。其中几个比较重要的类:

DllImportAttribute : 该类提供对非托管动态链接库进行引用的方法,并告诉我们的

编译器该程序的静态入口点是非托管的动态连接库,它的静态属性提供了对非托管动态链接

库进行调用所必需的信息,作为最基本的要求,该类应该定义提供调用的非托管动态链接库

的名称。

StructLayoutAttribute: 该类使得用户可以控制类或结构的数据字段的物理布局。

MarshalAsAttribute : 指示如何在托管代码和非托管代码之间封送数据。

发送消息时需要使用windows api 32函数

[DllImport("", EntryPoint = "SendMessage")]

private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);

此方法各个参数表示的意义

wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所

有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息

不被发送到子窗口。

msg:指定被发送的消息类型。例如:窗口消息WM_SYSCOMMAND:0x0112;键盘事件WM_KEYDOWN:

0x0100; 拷贝数据WM_COPYDATA:0x004A;

wP:消息内容。例如:WM_SYSCOMMAND 中的参数:窗口最大化SC_MAXIMIZE:0xF030

lP:指定附加的消息指定信息。例如自定义结构体。

示例1:SendMessage(wnd, WM_SYSCOMMAND, (IntPtr)0xF030, (IntPtr)0);

向指定窗口wnd,发送窗口消息WM_SYSCOMMAND,消息内容是窗口最大化0xF030,附加消息

为空。

示例2:

SendMessage(wnd, WM_KEYDOWN, (IntPtr)msg, (IntPtr)0);

向指定

窗口wnd,发送窗口消息WM_

KEYDOWN

,消息内容是

msg

,附加消息为空。接收端添加键盘

事件处理

public Form1()

{

InitializeComponent();

n += new KeyEventHandler(Form1_KeyDown);

}

//处理 WM_KEYDOWN事件

private void Form1_KeyDown(object sender, KeyEventArgs e)

{

= ng(a);

}

示例3:发送端:

public struct COPYDATASTRUCT

{

//用户自定义数据

public IntPtr dwData;

//消息长度

public int cbData;

//消息内容

//MarshalAs属性指示如何在托管代码和非托管代码之间封送数据

//UnmanagedType枚举值LPStr:单字节、空终止的 ANSI 字符串

[MarshalAs()]

public string lpData;

}

IntPtr wnd = ndowHandle;

byte[] sarr = es(

);

int len = ;

COPYDATASTRUCT cds;

= (IntPtr)100;

= ;

= len + 1;

SendMessage(wnd, WM_COPYDATA, (IntPtr)0, ref cds)

;

接收端:

const int WM_COPYDATA = 0x004A;

//Winform的消息处理,多数时候是通过事件处理程序进行的,但当没有对应的事件时通常

的做法是声明DefWndProc或者WndProc或者IMessageFilter

protected override void DefWndProc(ref Message m)

{

switch ()

{

case WM_COPYDATA:

COPYDATASTRUCT mystr = new COPYDATASTRUCT();


本文标签: 消息 托管 方法 发送 代码