要传递结构体

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 Camx 架构介绍

    Android Camx 架构介绍 原文链接:深入理解高通Camx Hal 概览 高通平台的Camera架构从以前用的mm-camera转向camx-chi,完全是两样不同的东西:软件架构不同.代码位 ...

  2. 【论文阅读】ICML2020: Can Autonomous Vehicles Identify, Recover From, and Adapt to Distribution Shifts?

    Column: January 6, 2022 7:18 PM Last edited time: January 30, 2022 12:14 AM Sensor/组织: Oxford Status ...

  3. 嵌入式工业开发板基础测试手册——基于NXP iMX6ULL开发板(1)

    前 言 本文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ubuntu18.04.4 ...

  4. gdb 根据c语言二进制文件进程号查看内部多线程任务

    C语言二进制文件 a 编译时添加了 -g (gdb 调试), 但是 gdb a 这种方式有时不容易复现一些场景.这时可以先正常启动 a, 然后根据 a 的进程号启动gdb调试. # 1. 找到程序进程 ...

  5. SpringMVC面试题及答案

    SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决? 问题:单例模式,在多线程访问时有线程安全问题 解决方法:不要用同步,在控制器里面不能写字段 SpringMvc 中控制器的注 ...

  6. 论文阅读: 面向Planning的端到端智驾Planning-oriented Autonomous Driving

    原文地址:https://arxiv.org/abs/2212.10156 背景 当代自动驾驶系统多采用序列化的模块化的任务处理方式,比如感知.预测.规划等.为了处理多样的任务.达到高水平智能,当代智 ...

  7. 敏捷开发(Scrum)

    ​ 一.敏捷的背景与动机 1.1 软件危机及软件工程的出现 速度是企业竞争致胜的关键因素,软件项目的最大挑战在于,一方面要应付变动中的需求,一方面要在紧缩的时程内完成项目,传统的软件工程难以满足这些要 ...

  8. 持久化技术Mybatis知识精讲【形成知识体系篇】

    环境要求 JDK1.8及以上版本 MySQL数据库 Apache Maven 3.6.1构建工具 IDEA/VSCode/Eclipse开发工具任选其一 思维导图:Xmind ZEN 技术要求 熟悉J ...

  9. tp5命名规范

    tp5中对类,文件名,函数和方法的命名规范如下: 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写) 类的命名采用驼峰法,并且首字母大写,例如 User.UserType,不需要添加contr ...

  10. C# 对象复制三种方法效率对比——反射、序列化、表达式树

    1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } publi ...