C# 在C#中使用SendMessage[转]
来源:互联网 发布:怎么看我的淘宝店铺 编辑:程序博客网 时间:2024/05/16 19:31
作者: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# 在C#中使用SendMessage[转]
- 在C#中使用SendMessage
- 在C#中使用SendMessage
- 在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在进程间传递数据的实例
- C#中使用SendMessage在进程间传递数据的实例
- [双语阅读]英皇家学会网上公开牛顿等名人手稿
- C与C++风格字符串
- “公务员考试”怎么说?
- 外貌主义 lookism
- C++中读入一行字符
- C# 在C#中使用SendMessage[转]
- developerWorks
- C# SendMessage备忘[转]
- 命令大全
- 请教:电子商务专业学生选择问题!
- POI操作Excel
- 快捷键
- 女人爱问的几个问题之标准答案
- stderr,stdin,stdout