在C#中使用SendMessage
来源:互联网 发布:51游戏java 编辑:程序博客网 时间:2024/05/06 02:20
在C#中使用SendMessage
日期:2005-02-04
作者:floodzhu
备注:主要描述在调用API函数SendMessage时数据类型的转换。
作者:floodzhu
备注:主要描述在调用API函数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();}
- 在C#中使用SendMessage
- 在C#中使用SendMessage
- 在C#中使用SendMessage
- C# 在C#中使用SendMessage[转]
- C#中使用SendMessage
- C#中使用SendMessage
- C#中使用sendMessage
- C#中SendMessage的使用
- C#中使用SendMessage函数
- C#中windos API SendMessage的使用
- C#中使用SendMessage在进程间传递数据的实例
- C#中使用SendMessage在进程间传递数据的实例
- C#中应用SendMessage
- C# 使用SendMessage 函数
- C# 使用sendMessage函数
- C# 使用SendMessage 函数
- 在C#中SendMessage和PostMessage的参数传递
- 在C#中SendMessage和PostMessage的参数传递
- 过年快回家了, 需要好好总结一下!
- 一个消息提示托盘程序的开发历程(采用socket技术,附源代码)三---客户端源代码
- .NET 中的对象序列化
- XOOPS HACK
- delphi的调用约定
- 在C#中使用SendMessage
- win2000/xp/2003下不能关闭程序的方法
- 怎么样知道硬盘上有哪几个分区或者指定的分区是在哪一个硬盘上
- Blog开张大吉
- 任务
- Class Loading ---(类装载机制,开发者不得不知道的故事) --上篇
- Class Loading ---(类装载机制,开发者不得不知道的故事) --中篇
- Class Loading ---(类装载机制,开发者不得不知道的故事) --下篇
- 19 / 9=?