C#中使用SendMessage在进程间传递数据的实例

简介: 原文: C#中使用SendMessage在进程间传递数据的实例 1 新建解决方案SendMessageExample 在解决方案下面新建三个项目:CopyDataStruct,Receiver和Sender。
原文: C#中使用SendMessage在进程间传递数据的实例

新建解决方案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。

 

目录
相关文章
|
9月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
361 10
|
物联网 数据处理 C#
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据。在自动化、物联网以及工业控制行业中,上位机开发是一项重要的技能。本教程主要介绍使用C#进行上位机开发,重点在于串口通信和数据处理。
2978 82
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
308 11
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
326 10
|
PHP
PHP的pcntl多进程用法实例
PHP使用PCNTL系列的函数也能做到多进程处理一个事务。
199 12
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
280 1
|
SQL 缓存 分布式计算
C#如何处理上亿级数据的查询效率
C#如何处理上亿级数据的查询效率
493 2
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
1009 0
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
276 0
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
433 0