关于C#中使用消息获取Message.LParam所包含的数据
在C#中也可以使用Windows 消息,包括系统消息和自定义消息。
对于自定义消息中,对于LParam可以在发中或者接收过程中使用自定义结构来传递数据
如:
public struct MyStruct
{
public int i;
public string str;
}
发送消息可以调用WindowsAPI,SendMessage:
MyStruct myst = new MyStruct();
SendMessage(hWnd, WM_USER, 0,ref myst);
接收消息可通过重写DefWndProc来实现:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch(m.Msg)
{
case WM_USER: // 任何消息
int iWPara = (int)m.WParam;
MyStruct myStr = new MyStruct();
Type myType=myType.GetType();
myType = (MyStruct)m.GetLParam(myType);
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
但是对于一些非自定义的消息, 如WM_SETTEXT,或者一些第三方应用所发出的消息,其中的LParam中可能包含的是一个指向字符串的指针,如char *,那么这时候如何取得LParam中的实际数据呢?
以一自定义消息为例,通过该消息的m.LParam.ToString()得知存储的数据类型为"String",
但是使用GetLParam(str.GetType())获取会出现错误,因为GetLParam只接受结构类型。那怎么办呢?
在网上查找了很久这方面的资料,发现问问题的很多,但是却没有找到直接的答案,能找到的都是通过自定义结构进行传递的例子,但这却并不能解决很多我们无法决定消息如何发送的情况,包括在MSDN中,也没有找到有关于此的直接介绍,后来无意想器,既然LParam是IntPtr的指针类型,那么,不调用GetLParam,而直接获取该指针指向的内存不就可以么?经过实践,一次成功:
那就是使用Marshal.Copy,将数据从非托管内存指针复制到托管 8 位无符号整数数组.
如下:
byte[] ch = new byte[256];
System.Runtime.InteropServices.Marshal.Copy(m.LParam,ch,0,255);
string str = System.Text.Encoding.Default.GetString(ch);//转换为字符串
这样,就成功获得了m.LParam所包含的字符数据。
利用Marshal.Copy,可以解决很多类似的情况,这样,无论LParam传递过来的是什么类型,也不能担心了,所有的消息,你可以尽情的来使用了~~哈哈
出处:https://blog.csdn.net/ck0074451665/article/details/5922073
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/14078965.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2020-12-03 13:11 jack_Meng 阅读(1303) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2015-12-03 AngularJS简介
2012-12-03 VBS _获取系统本次及上次开关机时间WinXP Win7兼容版