Windows API是Windows系统本身提供给我们使用的一些函数,让我们通过自己写的程序可以调用一些核心的功能。虽然.NET平台已经帮我们封装了很多有用的,但并不是全部,有些还是需要我们自己去写。
其实Windows提供的API在系统中是以dll的方式存在的,就像.NET的一些类库一样,但.NET的类库我们可以直接使用,而Windows API不是.NET平台的,而是C语言编写的,这让我们怎么调用?
.NET平台为我们提供了一个特性【DllImport】,通过这个特性,我们可以轻松调用Windows API。要使用DllImport特性,我们需要引入命名空间:【System.Runtime.InteropServices】。
下面,以一个我们在.NET中常用的【MessageBox】来解释一下。虽然.NET封装有MessageBox,但我们这里不使用,而是调用Windows API来实现。
用VS新建一个控制台程序,拷贝以下全部代码进去:
using System; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { MessageBox(IntPtr.Zero, "Windows API调用演示", "逍遥乐网", 0); Console.ReadLine(); } [DllImport("User32.dll")] public static extern int MessageBox(IntPtr hWnd, string lpText, string lpCaption, int uType); } }
直接运行,我们会看到弹出了一个熟悉的WinForm消息框。
可能有人会说了,我怎么知道你这个MessageBox不是.NET里面封装的那个?。。。。。。好吧,谁告诉你在控制台程序下是可以直接弹出.NET的MessageBox的?.NET的MessageBox是在【System.Windows.Forms】下的,看看上面的代码,我们有引入吗这个命名空间吗?(即使你想引入也引入不了!)
接下来就来解释一下上面的代码:
第14行,我们用DllImport来引入User32.dll,MessageBox就在这个dll里面。
第15行,就是我们要调用User32.dll里面的哪个方法。
第10行,就是我们熟悉的方法的调用。
在.NET里调用Windows函数的几个要点:
第一:名字要与Windows API的完全一样,也就是第15行的MessageBox。
第二:函数要用DllImport类修饰。
第三:函数要声明成public static extern的。
第四:函数的返回值和参数类型要与Windows API完全一致。由于.NET的数据类型与Windows API里参考的类型不一样,详见《windows API数据类型与.NET数据类型参照表》。
下面是MessageBox的原型,原文链接:MessageBox function
名称是MessageBox,第一个参数HWND对应IntPtr,第二、第三个参数LPCTSTR对应string,第四个参数UINT对应int,返回值为int。所以我们转换成.NET能识别的就是:
int MessageBox(IntPtr hWnd, string lpText, string lpCaption, int uType);
也就是上面代码的第15行。
至于每个参数是什么意思,请阅读原文链接。
有些人可能会说,我不知道DllImport该引用哪个dll?原文链接里页面拉到下面,你会看到:
倒数第二行DLL就是告诉你,这个是在User32.dll下。