C#.NET 调用 Windows API(Win32 API)

分类:.NET
 标签:Windows API,Win32 API,.NET,C#,DllImport
   修改 | 阅读(3388)| 评论(0)

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下。


您的昵称:*
QQ登录(无需注册直接登录可进行回复)
您的邮箱:(填写邮箱,如有回复可进行邮件通知)
验证码:
点击刷新