关于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

posted on   jack_Meng  阅读(1303)  评论(0编辑  收藏  举报

编辑推荐:
· 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兼容版

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩