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();
版权声明:本文标题:Winform进程通讯 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1710261324a564948.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论