zoukankan      html  css  js  c++  java
  • 【转】【C#】SendMessage

    SendMessage是一个在user32.dll中声明的API函数,在C#中导入如下:

    using System.Runtime.InteropServices;
    [DllImport("user32.dll", EntryPoint="SendMessageA")]
    public static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

    本文描述其参数 lParam 的用法,主要是数据类型之间的转化

    ● 一种最简单的处理方式是声明多个SendMessage函数(overload),用所需的数据类型直接替换IntPtr。

    例如:

    //声明:
    [DllImport("user32.dll", EntryPoint="SendMessageA")]
    private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam,  string lParam);
    [DllImport("user32.dll", EntryPoint="SendMessageA")]
    private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam,  ref Rectangle lParam);
    //调用:
    string s = "hello, floodzhu";
    SendMessage(this.textBox1.Handle, WM_SETTEXT, IntPtr.Zero, s);
    
    Rectangle rect = new Rectangle();
    SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, ref rect);

    ● 对要求返回字符串的类型(out string)可以用 StringBuilder 代替,此时不需要 out/ref。

    例如:

    [DllImport("user32.dll", EntryPoint="SendMessageA")]
    private static extern int SendMessage (IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
    private void button1_Click(object sender, System.EventArgs e)
    {
        const int buffer_size = 1024;
        StringBuilder buffer = new StringBuilder(buffer_size);
        SendMessage(this.textBox1.Handle, WM_GETTEXT, buffer_size, buffer);
        //MessageBox.Show(buffer.ToString());
    }

    ● 如果想用 InPtr 类型统一处理的话,可以借助于 Marshal 或者 GCHandle 的相关方法。

    例如:

    [DllImport("user32.dll", EntryPoint="SendMessageA")]
    private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
    
    private void button2_Click(object sender, System.EventArgs e)
    {
        Rectangle rect = new Rectangle();
        IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Rectangle)));
        Marshal.StructureToPtr(rect, buffer ,true);
    
        SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, buffer);
    
        rect = (Rectangle)Marshal.PtrToStructure(buffer, typeof(Rectangle));
    
        Marshal.FreeHGlobal(buffer);
    }

    或者

    private void button2_Click(object sender, System.EventArgs e)
    {
        Rectangle rect = new Rectangle();
        GCHandle gch = GCHandle.Alloc(rect);
    
        SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, (IntPtr)gch);
        rect = (Rectangle)Marshal.PtrToStructure((IntPtr)gch, typeof(Rectangle));
    
        gch.Free();
    }

    private const int WM_SETTEXT = 0x000C;
    private const int WM_GETTEXT = 0x000D;
    private const int EM_GETRECT = 0x00b2;
    private const int EM_SETRECT = 0x00b3;



    原文地址:http://www.cnblogs.com/me-sa/articles/669402.html
  • 相关阅读:
    mysql主从同步图
    VS2010智能提示失效,关键字不智能提示!
    mvc3的SaveChanges()方法无效,数据并没有更新!
    使用uploadify上传插件时遇到 NetworkError: 403 Forbidden http://xxxx/xxxx/ 错误
    Asp.net 调用mysql存储过程参数传中文乱码!
    The entity type XXXInfo is not part of the model for the current context.
    爬取汽车网站汽车数据
    《牛顿和莱布尼兹对最速降落线问题的解法,少为人知》 回复
    《谁能证明:标准波面的光若能汇集于一点,则它们的光程长度必然相等》 回复
    200^199 和 199^200 哪个大 ?
  • 原文地址:https://www.cnblogs.com/mqxs/p/5296071.html
Copyright © 2011-2022 走看看