博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中使用SendMessage在进程间传递数据的实例
阅读量:6848 次
发布时间:2019-06-26

本文共 3221 字,大约阅读时间需要 10 分钟。

原文:

新建解决方案SendMessageExample

在解决方案下面新建三个项目:CopyDataStructReceiverSender

其中,CopyDataStruct项目的输出类型为“类库”,ReceiverSender项目的输出类型为“Windows 应用程序”。

整个实例程序的结构如下图所示。

 

2 CopyDataStruct项目实现

定义结构体COPYDATASTRUCT代码如下所示。 

using System;using System.Runtime.InteropServices; namespace CopyDataStruct{    public struct COPYDATASTRUCT    {        public IntPtr dwData;        public int cbData;        [MarshalAs(UnmanagedType.LPStr)]        public string lpData;    }}

编译CopyDataStruct项目生成dll,再ReceiverSender项目中添加对此dll的引用。

3 Sender项目实现

Sender项目仅包含一个名称为“消息发送者”的窗体,如下图所示。

 

编写窗体后端代码,如下所示。

using System;using System.Runtime.InteropServices;using System.Windows.Forms;using CopyDataStruct; namespace Sender{    public partial class frmSender : Form    {        //Win32 API函数        [DllImport("User32.dll", EntryPoint = "SendMessage")]        private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);         [DllImport("User32.dll", EntryPoint = "FindWindow")]        private static extern int FindWindow(string lpClassName, string lpWindowName);         const int WM_COPYDATA = 0x004A;         public frmSender()        {            InitializeComponent();        }         private void btnSend_Click(object sender, EventArgs e)        {            int hWnd = FindWindow(null, @"消息接受者");            if (hWnd == 0)            {                MessageBox.Show("555,未找到消息接受者!");            }            else            {                byte[] sarr = System.Text.Encoding.Default.GetBytes(txtString.Text);                int len = sarr.Length;                COPYDATASTRUCT cds;                cds.dwData = (IntPtr)Convert.ToInt16(txtInt.Text);//可以是任意值                cds.cbData = len + 1;//指定lpData内存区域的字节数                cds.lpData = txtString.Text;//发送给目标窗口所在进程的数据                SendMessage(hWnd, WM_COPYDATA, 0, ref cds);            }        }    }}

4  Receiver项目实现

Receiver项目仅包含一个名称为“消息接受者”的窗体,如下图所示。

 

编写窗体的后端代码,如下所示。

using System;using System.Windows.Forms;using CopyDataStruct; namespace Receiver{    public partial class frmReceiver : Form    {        const int WM_COPYDATA = 0x004A;        public frmReceiver()        {            InitializeComponent();        }         protected override void DefWndProc(ref Message m)        {            switch (m.Msg)            {                case WM_COPYDATA:                    COPYDATASTRUCT cds = new COPYDATASTRUCT();                    Type t = cds.GetType();                    cds = (COPYDATASTRUCT)m.GetLParam(t);                    string strResult = cds.dwData.ToString() + ":" +cds.lpData;                      lsvMsgList.Items.Add(strResult);                    break;                default:                    base.DefWndProc(ref m);                    break;            }        }    }}

5 运行结果

运行消息发送和消息接收程序(Sender.exe和Receiver.exe),效果如下图所示。

 

 

实例说明

6.1 SendMessage方法参数说明

  • hWnd:接收消息的窗口的句柄
  • Msg:消息标识符
  • wParam:32位的特定附加信息,具体取决于消息
  • lParam:32位特定附加信息,具体取决于消息

6.2 WM_COPYDATA消息说明

使用WM_COPYDATA消息,lParam参数可以指向一个 COPYDATASTRUCT结构体类型的变量

typedef struct COPYDATASTRUCT{  ULONG_PTR dwData;  //可以是任意值  DWORD cb_data;  //指定lpData内存区域的字节数  PVOID lpData;  //发送给目录窗口所在进程的数据}COPYDATASTRUCT;
若定义的结构体不满足上面的定义,在接收端无法正确获取
lParam参数指向的数据。

另外,WM_COPYDATA消息的标识符为0x004A。

 

你可能感兴趣的文章
思科交换机和路由器设备实现DHCP功能
查看>>
MongoDB安装与操作大全
查看>>
人我的是好有是的好sula
查看>>
编译工程时报java:[1,0] illegal character: \65279问题排查与解决过
查看>>
RHEL6子接口及双网卡绑定配置
查看>>
常见系统故障排查
查看>>
正则验证手机号是否合法
查看>>
《Git权威指南》读书笔记 第四章 git初始化
查看>>
《Head first HTML与CSS 第二版》读书笔记 第九章 盒模型
查看>>
《Python面向对象……》之目录
查看>>
集群入门简析及LB下LVS详解
查看>>
Linux与GPT
查看>>
管理或技术
查看>>
分配到弱属性;对象将在赋值之后释放
查看>>
java作用域public ,private ,protected 及不写时的区别
查看>>
until循环语句
查看>>
Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现
查看>>
提高用户体验方式:饥饿营销
查看>>
Java8中的LocalDateTime工具类
查看>>
Exchange 2013 PowerShell创建自定义对象
查看>>