MoveWindow
SetWindowPos
用 Visual C#调用 Windows API 函数
Api 函数是构筑 Windws 应用程序的基石,每一种 Windows 应用程序开发工具,它提供的底层函
数都间接或直接地调用了 Windows API 函数,同时为了实现功能扩展,一般也都提供了调用
WindowsAPI 函数的接口, 也就是说具备调用动态连接库的能力。Visual C#和其它开发工具一样
也能够调用动态链接库的 API 函数。.NET 框架本身提供了这样一种服务,允许受管辖的代码调用动
态链接库中实现的非受管辖函数,包括操作系统提供的 Windows API 函数。它能够定位和调用输出
函数,根据需要,组织其各个参数(整型、字符串类型、数组、和结构等等)跨越互操作边界。
下面以 C#为例简单介绍调用 API 的基本过程:
动态链接库函数的声明
动态链接库函数使用前必须声明,相对于 VB,C#函数声明显得更加罗嗦,前者通过 Api Viewer
粘贴以后,可以直接使用,而后者则需要对参数作些额外的变化工作。
动态链接库函数声明部分一般由下列两部分组成,一是函数名或索引号,二是动态链接库的文件
名。
譬 如 , 你 想 调 用 User32.DLL 中 的 MessageBox 函 数 , 我 们 必 须 指 明 函 数 的 名 字
MessageBoxA 或 MessageBoxW,以及库名字 User32.dll,我们知道 Win32 API 对每一个涉及字
符串和字符的函数一般都存在两个版本,单字节字符的 ANSI 版本和双字节字符的 UNICODE 版本。
下面是一个调用 API 函数的例子:
[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW", SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);
其中入口点 EntryPoint 标识函数在动态链接库的入口位置,在一个受管辖的工程中,目标函数的
原始名字和序号入口点不仅标识一个跨越互操作界限的函数。而且,你还可以把这个入口点映射为
一个不同的名字,也就是对函数进行重命名。重命名可以给调用函数带来种种便利,通过重命名,
一方面我们不用为函数的大小写伤透脑筋,同时它也可以保证与已有的命名规则保持一致,允许带
有不同参数类型的函数共存,更重要的是它简化了对 ANSI 和 Unicode 版本的调用。CharSet 用于
标识函数调用所采用的是 Unicode 或是 ANSI 版本,ExactSpelling=false 将告诉编译器,让编译
器决定使用 Unicode 或者是 Ansi 版本。其它的参数请参考 MSDN 在线帮助.
在 C#中,你可以在 EntryPoint 域通过名字和序号声明一个动态链接库函数,如果在方法定义中
使用的函数名与 DLL 入口点相同,你不需要在 EntryPoint 域显示声明函数。否则,你必须使用下
列属性格式指示一个名字和序号。
[DllImport("dllname", EntryPoint="Functionname")]
[DllImport("dllname", EntryPoint="#123")]
值得注意的是,你必须在数字序号前加“#”
下面是一个用 MsgBox 替换 MessageBox 名字的例子:
[C#]
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MsgBox(int hWnd, String text, String caption, uint type);
}
- 1
- 2
- 3
前往页