C# 下的进程间的通讯 -- 发消息篇
来源:互联网 发布:犀牛软件没有工具栏 编辑:程序博客网 时间:2024/05/22 07:03
Net 并没有提供进程间通讯的类,其实这句话是不对的,.Net提供了强大的进程间通讯的功能,不仅可以完成本机上进程间的通讯,还可以完成网络上的任意两台计算机间的进程通讯。这些技术分别为WebService、企业级服务、.NET 远程处理,我会在后面的文章中逐步学习总结。
这里还是借助系统的功能来实现,提供一种利用发送消息的方法实现的进程间的通信。
发送方需要调用两个系统API:SendMessage与FindWindow。
非托管定义如下:
[DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
int hWnd, //目标窗口的handle
int Msg, // 消息
int wParam, // 第一个消息参数
ref COPYDATASTRUCT lParam // 第二个消息参数
);
[DllImport("User32.dll",EntryPoint="FindWindow")]
private static extern int FindWindow(string lpClassName,string
lpWindowName);
还有一个数据结构:
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)] public string lpData;
}
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)] public string lpData;
}
WM_COPYDATA消息:
const int WM_COPYDATA = 0x004A;
发送消息代码如下:
int WINDOW_HANDLER = FindWindow(null,@"接收窗口");
if(WINDOW_HANDLER != 0)
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(txtMsg.Text);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr) 100;
cds.lpData = txtMsg.Text;
cds.cbData = len + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
}
if(WINDOW_HANDLER != 0)
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(txtMsg.Text);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr) 100;
cds.lpData = txtMsg.Text;
cds.cbData = len + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
}
接收方需要上面的那个数据结构的定义与消息常量的定义,然后重写主窗口的DefWndProc方法:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
txtMsg.Text =mystr.lpData;
break;
default:
base.DefWndProc(ref m);
break;
}
}
{
switch(m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr =(COPYDATASTRUCT)m.GetLParam(mytype);
txtMsg.Text =mystr.lpData;
break;
default:
base.DefWndProc(ref m);
break;
}
}
别忘了引用命名空间:System.Runtime.InteropServices;
- C# 下的进程间的通讯 -- 发消息篇
- C# 下的进程间的通讯 -- 发消息篇
- C#下的进程间的通讯 -- 共享内存篇
- linux下的进程间通讯
- linux下的进程间通讯
- WINDOWS下进程间的通讯方式
- WINDOWS下进程间的通讯方式
- java开发操作系统:进程间的消息通讯
- 进程间的通讯方式_消息队列
- 最简单的进程间发消息通知
- C#下的进程间的通讯 -- 共享内存--内存互斥控制
- 进程间的通讯
- 进程间的通讯
- 一个进程间同步和通讯的 C# 框架
- 一个进程间同步和通讯的 C# 框架
- 进程间通讯--消息队列
- 进程间通讯-消息队列
- 进程间通讯:消息队列
- Swt/Jface listviewer的实现
- Swt/Jface中提供的dialog
- swt/jface 自定义 Dialog
- 给自定义Dialog加入保留对话框值的功能
- eclipse 插件开发中如何实现刷新和重编译
- C# 下的进程间的通讯 -- 发消息篇
- PC Camera开发日志(十四)---- 用IPicture在窗口中显示一幅 JPG 图象
- 利用SendMessage实现C#进程间通信
- log4j.properties 使用
- PC Camera开发日志(十五)---- 基于MFC的大型数据文件处理方法
- 在MyEclipse里设置Spket支持ExtJS编程的环境
- 电脑装不上系统
- 【任务】请大家在各自家中的机器上安装测速插件
- sy-ucomm = ''