C#自定义结构体的(用SendMessage)传递
要传递结构体
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)传递的更多相关文章
- 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- Qt--信号槽传递自定义结构体参数
自定义结构体参数的信号槽连接 (1) 对于自定义的结构体参数,信号槽无法识别参数,导致信号槽连接不起作用.所以需要注册结构体参数.在结构体中声明结束的地方加上结构体注册. struct DealDet ...
- typedef和自定义结构体类型
在自定义结构体类型时会用到typedef关键字.大家都知道typedef是取别名的意思,在C语言中跟它容易混淆的有const,#define等,其区别不在本篇文章讨论之列. /*定义单链表结点类型*/ ...
- qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)
参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVa ...
- C语言中结构体參数变量的传递
[文章摘要] 在C语言中,结构体參数变量常常作为函数的參数来进行传递.但假设參数设置不当.会出现内存问题. 本文以实际的程序代码为例.具体地介绍怎样正确地使用结构体參数变量.为相关的开发工作提供了參考 ...
- iOS自定义结构体
一.提要 通过以官方的CGSize为例,自定义Objective-C中的结构体,并使用. 二.CGSize 1.系统定义的CGSize结构体 struct CGSize { CGFloat width ...
- Solidity的自定义结构体深入详解
一.结构体定义 结构体,Solidity中的自定义类型.我们可以使用Solidity的关键字struct来进行自定义.结构体内可以包含字符串,整型等基本数据类型,以及数组,映射,结构体等复杂类型.数组 ...
- 用set、map等存储自定义结构体时容器内部判别各元素是否相同的注意事项
STL作为通用模板极大地方便了C++使用者的编程,因为它可以存储任意数据类型的元素 如果我们想用set与map来存储自定义结构体时,如下 struct pp { double xx; double y ...
- gin中绑定表单数据至自定义结构体
package main import "github.com/gin-gonic/gin" type StructA struct { FieldA string `form:& ...
- Qt 信号槽传递自定义结构体
Qt 在信号和槽中使用自己定义的结构体
随机推荐
- 图最短路径之BellmanFord
Bellman–Ford Algorithm 算法参考地址:Bellman–Ford Algorithm | DP-23 - GeeksforGeeks 算法的简介 在图中给定一个图形和一个源顶点 s ...
- ARM GIC 系列文章学习(转)
原文来自:骏的世界 ARM GIC(一) cortex-A 处理器中断简介 对于ARM的处理器,中断给处理器提供了触觉,使处理器能够感知到外界的变化,从而实时的处理.本系列博文,是以ARM corte ...
- ubuntu16.04 安装 eclips c/c++
前言 最近需要在ubuntu16上使用eclips编译c,尝试了apt安装和官网最新包安装甚至应用商店安装,效果都不太理想,现在把我的安装方法记录一下. 正文 !!!前提,已经自己配置好了java8的 ...
- VulnHub-Narak靶机渗透流程
VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ...
- Linux使用Mysql数据库
启动MySQL: service mysqld start 或者使用如下命令: /etc/init.d/mysqld start 重新启动MySQL: service mysqld restart 或 ...
- Mysql生成实体类
-- 查询数据表结构 SELECT CONCAT('"e.',SUBSTRING(COLUMN_NAME,1),',"+'),COLUMN_NAME,',',COLUMN_TYPE ...
- 使用C#对华为IPC摄像头二次开发(二)
上一篇我们实现了用SDK登录摄像头并实现预览(https://www.cnblogs.com/wdw984/p/13564195.html),这次我们实现通过SDK调用摄像头本身自带的人脸抓拍功能. ...
- acwing 875
acwing875 题目大意:快速幂模板题 Train of thought 此题如果采用暴力的做法时间复杂度为0(n*b); n为样例的数目,b是幂 我们想要优化暴力的做法,首先样例的数量是没有办法 ...
- 拥抱未来:GPT-4将如何改变我们的世界
随着人工智能技术的迅猛发展,我们正迎来一个全新的智能时代.在这个时代的前沿,GPT-4作为开拓者和领航者,正在重新定义人机交互.创意创新和个性化服务的标准.无论是在商业领域.教育场景还是科研领域,GP ...
- 网易数帆实时数据湖 Arctic 的探索和实践
作者 | 蔡芳芳 采访嘉宾 | 马进 网易数帆平台开发专家 数据中台也要从离线为主走向实时化,湖仓一体是第一步. 数据从离线到实时是当前一个很大的趋势,但要建设实时数据.应用实时数据还面临两个难题.首 ...