要传递结构体

public struct STUDENT
{
public int id; //ID
public string name; //姓名
}

要引用Win32api函数FindWindow,SendMessage

 /// <summary>
/// 查找窗体句柄
/// </summary>
/// <param name="lpClassName">指定的类名</param>
/// <param name="lpWindowName">指定的窗口名称</param>
/// <returns>返回窗口句柄</returns>
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(
string lpClassName,
string lpWindowName); /// <summary>
/// 查找窗体句柄
/// </summary>
/// <param name="hwndParent">父窗口句柄</param>
/// <param name="hwndChildAfter">子窗口句柄</param>
/// <param name="lpClassName">窗口类名</param>
/// <param name="lpWindowName">窗口名称</param>
/// <returns></returns>
[DllImport("User32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(
IntPtr hwndParent,
IntPtr hwndChildAfter,
string lpClassName,
string lpWindowName); [DllImport("User32.dll", EntryPoint = "SendMessage")] public static extern int SendMessage(
IntPtr hWnd,    // 窗口句柄
int Msg,    // message
int wParam,  // first message parameter
IntPtr lParam); // second message parameter

3,还要定义个消息

public const int WM_COPYDATA = 0X004A;

也可以发送自定义消息   public const int WM_USER = 1024;        //自定义消息

4,发送消息

//先查找要发送的窗口句柄
IntPtr nRet = Win32API.FindWindowEx(IntPtr.Zero, IntPtr.Zero,null , "Form2");
if (nRet == IntPtr.Zero)
MessageBox.Show("没有找到指定的窗口"); STUDENT stu = new STUDENT();
stu.id = 101;
stu.name = "我是发送者";
IntPtr stuPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(STUDENT)));
Marshal.StructureToPtr(stu, stuPtr, false); SendMessage(nRet, WM_COPYDATA, 0, stuPtr);
      //用PostMessage发送消息
      //PostMessage(nRet, WM_USER, 0, stuPtr);

5,在接收窗口中重写DefWndProc函数

public const int WM_COPYDATA = 0X004A;
public const int WM_USER = 1024;        //自定义消息

protected override void DefWndProc(ref Message m)
{ if(m.Msg==WM_COPYDATA)
{ STUDENT stu = (STUDENT)Marshal.PtrToStructure(m.LParam, typeof(STUDENT));
textBox1.Text = stu.name;
          return;
}
        

if(m.Msg==WM_USER)
{
  STUDENT stu = (STUDENT)Marshal.PtrToStructure(m.LParam, typeof(STUDENT));
  textBox1.Text = stu.name;
  return;
}

            base.DefWndProc(ref m);
}

 6,在接收窗口也要定义WM_COPYDATA消息,和结构体,

7,在WM_COPYDATA传递COPYDATASTRUCT结构体也是可行的

IntPtr cdsPtr = IntPtr.Zero;
cdsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(COPYDATASTRUCT)));
Marshal.StructureToPtr(cds, cdsPtr, false);

SendMessage(nRet, WM_COPYDATA, 0, cdsPtr);

接收窗口中

COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
textBox1.Text = cds.lpData;

注意:要用Marshal类要加命名空间 using System.Runtime.InteropServices;

今天就弄到这了,其他的API以后有时间再弄

C#自定义结构体的(用SendMessage)传递的更多相关文章

  1. 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?

    前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...

  2. Qt--信号槽传递自定义结构体参数

    自定义结构体参数的信号槽连接 (1) 对于自定义的结构体参数,信号槽无法识别参数,导致信号槽连接不起作用.所以需要注册结构体参数.在结构体中声明结束的地方加上结构体注册. struct DealDet ...

  3. typedef和自定义结构体类型

    在自定义结构体类型时会用到typedef关键字.大家都知道typedef是取别名的意思,在C语言中跟它容易混淆的有const,#define等,其区别不在本篇文章讨论之列. /*定义单链表结点类型*/ ...

  4. qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)

    参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVa ...

  5. C语言中结构体參数变量的传递

    [文章摘要] 在C语言中,结构体參数变量常常作为函数的參数来进行传递.但假设參数设置不当.会出现内存问题. 本文以实际的程序代码为例.具体地介绍怎样正确地使用结构体參数变量.为相关的开发工作提供了參考 ...

  6. iOS自定义结构体

    一.提要 通过以官方的CGSize为例,自定义Objective-C中的结构体,并使用. 二.CGSize 1.系统定义的CGSize结构体 struct CGSize { CGFloat width ...

  7. Solidity的自定义结构体深入详解

    一.结构体定义 结构体,Solidity中的自定义类型.我们可以使用Solidity的关键字struct来进行自定义.结构体内可以包含字符串,整型等基本数据类型,以及数组,映射,结构体等复杂类型.数组 ...

  8. 用set、map等存储自定义结构体时容器内部判别各元素是否相同的注意事项

    STL作为通用模板极大地方便了C++使用者的编程,因为它可以存储任意数据类型的元素 如果我们想用set与map来存储自定义结构体时,如下 struct pp { double xx; double y ...

  9. gin中绑定表单数据至自定义结构体

    package main import "github.com/gin-gonic/gin" type StructA struct { FieldA string `form:& ...

  10. Qt 信号槽传递自定义结构体

    Qt 在信号和槽中使用自己定义的结构体

随机推荐

  1. 高通Android分区表详解

    高通Android分区表详解 Label Purpose of this partition Modem Partition for modem Fsc Cookie partition to sto ...

  2. 实时系统Preempt RT与Xenomai之争!谁更主流,谁更实时?

    选择争论一直存在 大家知道EtherCAT是实时现场总线技术,当我们开发一款支持EtherCAT总线的控制器时,实时操作系统的选择不仅对于产品本身是最重要的一部分,而且对产品研发的整个过程也影响深远. ...

  3. PromQL全方位解读:监控与性能分析的关键技术

    本文全面探索PromQL,从基础语法到高级操作,详细介绍了数据聚合.时间序列分析及内置函数应用,旨在提升用户构建复杂监控策略和性能分析的能力. 关注[TechLeadCloud],分享互联网架构.云服 ...

  4. Node.js 的ORM(Sequelize) 的使用

    Sequelize是一个Node.js 的ORM.什么是ORM呢?对象关系映射(Object Relational Mapping).什么意思?就是在编程语言中,很容易创建对象,如果在面向对象的语言中 ...

  5. python3 socket 获取域名信息

    可以当ping用,应用场景可以在一些没有安装ping工具的镜像容器中,诊断dns或域名的可用性. #-*- coding:utf-8 -*- import socket import tracebac ...

  6. 数据源dataSource以及事务tx的xml文件配置方式及代码配置方式

    所需要使用的依赖 <dependencies> <!--spring jdbc Spring 持久化层支持jar包--> <dependency> <grou ...

  7. SpringBoot中使用Servlet3.0注解开发自定义的拦截器

    使用Servlet3.0的注解进行配置步骤 启动类里面加@ServletComponentScan,进行扫描 新建一个Filter类,implements Filter,并实现对应的接口 @WebFi ...

  8. JDK1.8新特性Lambda表达式简化if-else里都有for循环的优化方式

    在日常开发过程当中,能把代码写出来,不一定就意味着能把代码写好,说不准,所写的代码在他人看来,其实就是一坨乱七八糟的翔,因此,代码简化尤其重要,我曾经遇到过这样一个类型的代码,即if-else里都有相 ...

  9. PixiJS源码分析系列:第二章 渲染在哪里开始?

    第二章 渲染在哪里开始? 牢记,按第一章介绍的 npm start 启动本地调式环境才可进行调式 如果是 example 文件夹内的例子还需要 serve . 开启本地静态服务器 上一章介绍了 Pix ...

  10. iOS开发基础133-崩溃预防

    现代移动应用的用户体验依赖于其稳定性和可靠性.然而,在开发过程中,我们时常会遇到各种崩溃问题.崩溃不仅会影响用户的使用体验,还可能损害应用的声誉.因此,本文将详细介绍一个名为CrashPreventi ...