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

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

新建解决方案SendMessageExample

在解决方案下面新建三个项目:CopyDataStruct,Receiver和Sender。

其中,CopyDataStruct项目的输出类型为“类库”,Receiver和Sender项目的输出类型为“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,再在Receiver和Sender项目中添加对此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;

            }

        }

    }

}

运行结果

运行消息发送和消息接收程序(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。

 

转载地址:http://ruiql.baihongyu.com/

你可能感兴趣的文章
Linux下iptables的简介和自己的记录
查看>>
类的operator new与operator delete的重载
查看>>
tn文本分析语言(三):高级语法
查看>>
iOS:提示框(警告框)控件UIActionSheet的详解
查看>>
分析Linux内核创建一个新进程的过程【转】
查看>>
Web API应用架构设计分析(2)
查看>>
.NET插件系统之二——不实例化获取插件信息和可视化方法
查看>>
让asp.net默认的上传组件支持进度条反映
查看>>
EXTJS学习系列提高篇:第十一篇(转载)作者殷良胜,制作树形菜单之五
查看>>
从代码分析Android-Universal-Image-Loader的图片加载、显示流程
查看>>
阿里妈妈首次公开新一代自研智能检索模型 | WWW 2018论文解读
查看>>
使用Depth Texture
查看>>
第 9 章 PBX
查看>>
ylbtech-LanguageSamples-Porperties(属性)
查看>>
第 4 章 Music score
查看>>
架构设计目录
查看>>
Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
查看>>
学习笔记: CSS3 鼠标悬停动画
查看>>
ylbtech-cnblogs(博客园)-数据库设计-7,News(新闻)
查看>>
WCF 基础简介
查看>>