zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    Mysql备份和恢复
    前端Css学习
    jQuery学习
    HTML页面学习
    Linux下java环境变量配置
    windows下java环境变量标准配置
    oracle查询消耗服务器资源SQL语句
    Java主线程在子线程执行完毕后再执行
    CentOS7 安装 Redis
    查看Oracle表空间使用情况
  • 原文地址:https://www.cnblogs.com/mq0036/p/14078965.html
Copyright © 2011-2022 走看看