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

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

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

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

例如:

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

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

例如:

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

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

例如:

  1. [DllImport("user32.dll", EntryPoint="SendMessageA")]
  2. private static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
  3.  
  4. private void button2_Click(object sender, System.EventArgs e)
  5. {
  6. Rectangle rect = new Rectangle();
  7. IntPtr buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Rectangle)));
  8. Marshal.StructureToPtr(rect, buffer ,true);
  9.  
  10. SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, buffer);
  11.  
  12. rect = (Rectangle)Marshal.PtrToStructure(buffer, typeof(Rectangle));
  13.  
  14. Marshal.FreeHGlobal(buffer);
  15. }

或者

  1. private void button2_Click(object sender, System.EventArgs e)
  2. {
  3. Rectangle rect = new Rectangle();
  4. GCHandle gch = GCHandle.Alloc(rect);
  5.  
  6. SendMessage(this.richTextBox1.Handle, EM_GETRECT, (IntPtr)0, (IntPtr)gch);
  7. rect = (Rectangle)Marshal.PtrToStructure((IntPtr)gch, typeof(Rectangle));
  8.  
  9. gch.Free();
  10. }

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

  1.  
  2. 原文地址:http://www.cnblogs.com/me-sa/articles/669402.html

【转】【C#】SendMessage的更多相关文章

  1. C#调用SendMessage 用法

    函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一.    函数原型:LRESUL ...

  2. Handler sendMessage 与 obtainMessage (sendToTarget)比较

    转自:http://iaiai.iteye.com/blog/1992196 obtainmessage()是从消息池中拿来一个msg 不需要另开辟空间new new需要重新申请,效率低,obtian ...

  3. Handler.sendMessage 与 Handler.obtainMessage.sendToTarget比较

    原文地址: http://www.cnblogs.com/android007/archive/2012/05/10/2494766.html 话说在工作中第一次接触android 的Handler ...

  4. winform窗体之间通过 windows API SendMessage函数传值

    -----------------------------------------------------------‘接收窗体’代码.cs------------------------------ ...

  5. [C#.net]PostMessage与SendMessage的区别

    用 PostMessage.SendNotifyMessage.SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处 ...

  6. [C#.net] SendMessage

    函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一.     函数原型:LRESU ...

  7. android wifi obtainmessage sendmessage解析

    obtainmessage 从message pool获取一个对象 sendmessage 将message插入message queue java中wait和notify是一对,wait进入睡眠等待 ...

  8. 【转】在C#中使用SendMessage

    SendMessage是一个在user32.dll中声明的API函数,在C#中导入如下: using System.Runtime.InteropServices; [DllImport(" ...

  9. [外挂6]在指定位置下棋 SendMessage函数

    a.鼠标软件模拟,函数SendMessage b.分析窗口内棋子相对坐标X,Y c.软件模拟点击棋盘坐标x,y处的棋子 ::SendMessage(hwnd,WM_LBUTTOMDOWN,0,YX); ...

  10. C_中使用SendMessage

    SendMessage是一个在user32.dll中声明的API函数,在C#中导入如下: using System.Runtime.InteropServices; [DllImport(" ...

随机推荐

  1. 安卓开发_浅谈SubMenu(子菜单)

    子菜单,即点击菜单后出现一个菜单栏供选择 创建子菜单的步骤: (1) 覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法来添加子菜单 (2 ...

  2. [linux]CentOS无法使用epel源

    [linux]CentOS无法使用epel源 问题的产生与解决 作者作为Android应用开发者,对linux的接触一直是ubuntu为主,但是有一个用于科学上网的vps,由于内存只有64M,所以使用 ...

  3. 斯坦福iOS7公开课10笔记及演示Demo

    这一节主要介绍了多线程中的串行队列以及滚动视图UIScrollView. 1 .多线程 这一节只是简单介绍了多线程的串行队列,即把任务加入线程队列后按顺序逐步执行. (1)目前iOS多线程提供的方法主 ...

  4. iOS开发网络篇—网络编程基础(一)

    一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新 ...

  5. navicat 连接sqlserver提示要安装 sql server native client

    navicat 连接sqlserver提示要安装 sql server native client 解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!

  6. Linux线程学习(一)

    一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...

  7. Git基本使用命令

    整理Git的一些基本使用命令.   # 1)克隆代码 boldseas@lian-PC MINGW64 /d/TestGroup $ git clone ssh://git@code.boldseas ...

  8. C# 日志框架的添加

    .NET中 记录日志的比较好的主要是Log4Net和Enterprise Library的Logging 复杂一点的还可以实现自动化Log日志 教程 首先是第二种方式 1.需要添加以下几个DLL  下 ...

  9. 肯爹的 StringUtils.isNumeric(String str)

    在项目中遇到一处bug,调试的结果竟然是StringUtils.isNumeric(String str) 在捣鬼(采用的是org.apache.commons.lang.StringUtils),下 ...

  10. C#操作XML小结(转)

    一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...