C#中调用API

介绍 
API( Application Programming Interface ),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能否认API在Windows编程中的重要性.大多数的编程语言都支持API编程,而.Net平台中的MFC(Microsoft Foundation Class Library)构架本身就封装了大部分的API.

做为程序员,我们需要了解API从字面上了解便是编程接口,因此,做为开发者,需要了解的只是API的使用方法.

API根据操作系统、处理器及功能性的不同而拥有很多不同的类型.     操作系统特用的API:

每种操作系统都有许多通用的API以及一些特用的API,这些特用的API只能在当前操作系统中执行.

例如:

Windows NT 支持 MS-DOS, Win16, Win32, POSIX ( Portable Operating System Interface ), OS/2 console API; 而 Windows 95 支持 MS-DOS, Win16 以及 Win32 APIs.

Win16 & Win32 API:

Win16是为十六位处理器开发的,早期的操作系统均支持.

Win32则是为32位处理器开发.它可移植性强,被大部分的处理器所支持.

Win32 API在库名后有一个”32”后缀.比如KERNEL32,USER32等.

所有API在下面3个库中得以运行:

Kernel 
User 
GDI

1. KERNEL

他的库名为 KERNEL32.DLL, 他主要用于产生与操作系统之间的关联:

程序加载 
     上下文选择. 
     文件输入输出. 
     内存管理. 
     例如: GlobalMemoryStatus 函数就包括当前物理内存及虚拟内存的使用信息.

2. USER

这个类库在Win32中名叫 USER32.DLL.

它允许管理全部的用户接口,比如:

窗口 
     菜单 
     对话框 
     图标等., 
     例如: DrawIcon 函数将在指定的设备关联上“画”出图标或者鼠标.

3. GDI ( Graphical Device Interface )

它在Win32中的库名为:GDI32.dll,它是图形输出库.使用GDI Windows“画”出窗口、菜单以及对话框等:

它能创建图形输出. 
     它也能保存图形文件. 
     例如: CreateBitmap 函数就能通过指定的长、宽、颜色创建一个位图.
C# 中操作API :

作为初学者来说,在C#中使用API确是一件令人头疼的问题.在使用API之间你必须知道如何在C#中使用结构、类型转换、安全/不安全代码,可控/不可控代码等许多知识.

一切从简单开始,复杂的大家一时不能接受.我们就从实现一个简单的MessageBox开始.首先打开VS.Net ,创建一个新的C#工程,并添加一个Button按钮.当这个按钮被点击,则显示一个MessageBox对话框.

即然我们需要引用外来库,所以必须导入一个Namespace:

using System.Runtime.InteropServices;

接着添加下面的代码来声明一个API:

[DllImport( "User32.dll" )]

public static extern int MessageBox( int h, string m, string c, int type );

此处DllImport属性被用来从不可控代码中调用一方法.”User32.dll”则设定了类库名.DllImport属性指定dll的位置,这个dll中包括调用的外部方法.Static修饰符则声明一个静态元素,而这个元素属于类型本身而不是上面指定的对象.extern则表示这个方法将在工程外部执行,使用DllImport导入的方法必须使用extern修饰符.

MessageBox 则是函数名,拥有4个参数,其返回值为数字.

大多数的API都能传递并返回值.

添中Click点击事件代码:

protected void button1_Click( object sender, System.EventArgs e )


    
    MessageBox ( 0,"API Message Box","API Demo",0 ); 
    
}

编译并运行这个程序,当你点击按钮后,你将会看到对话框,这便是你使用的API函数.

使用结构体

操作带有结构体的API比使用简单的API要复杂的多.但是一旦你掌握了API的过程,那个整个API世界将在你的掌握之中.

下面的例子中我们将使用GetSystemInfo API 来获取整个系统的信息.

第一步还是打开C#建立一个Form工程,同样的添中一个Button按钮,在代码窗中输入下面的代码,导入Namespace:

using System.Runtime.InteropServices;

声明一个结构体,它将做为GetSystemInfo的一个参数:

[StructLayout( LayoutKind.Sequential )]

public struct SYSTEM_INFO { 
    
    public uint dwOemId; 
    
    public uint dwPageSize; 
    
    public uint lpMinimumApplicationAddress; 
    
    public uint lpMaximumApplicationAddress; 
    
    public uint dwActiveProcessorMask; 
    
    public uint dwNumberOfProcessors; 
    
    public uint dwProcessorType; 
    
    public uint dwAllocationGranularity; 
    
    public uint dwProcessorLevel; 
    
    public uint dwProcessorRevision; 
    
}

声明API函数:

[DllImport( "kernel32" )]

static extern void GetSystemInfo( ref SYSTEM_INFO pSI );

添加下面的代码至按钮的点击事件处理中:

首先创建一个SYSTEM_INFO结构体,并将其传递给GetSystemInfo函数.

protected void button1_Click ( object sender, System.EventArgs e )


    
    try 
    
    { 
        
        SYSTEM_INFO pSI = new SYSTEM_INFO( ); 
        
        GetSystemInfo( ref pSI ); 
        
        // 
        
        // 
        
        //  
        
     一旦你接收到返回的结构体,那么就可以以返回的参数来执行操作了. 
        
        
        e.g.listBox1.InsertItem ( 0,pSI.dwActiveProcessorMask.ToString( ) );: 
        
        // 
        
        // 
        
        // 
        
    } 
    
    catch( Exception er ) 
    
    { 
        
        MessageBox.Show ( er.Message ); 
        
    } 
    
}

调用API全部代码

//Created By Ajit Mungale

//程序补充 飞刀

namespace UsingAPI


    
    using System; 
    
    using System.Drawing; 
    
    using System.Collections; 
    
    using System.ComponentModel; 
    
    using System.WinForms; 
    
    using System.Data; 
    
    using System.Runtime.InteropServices; 
    
    //Struct 收集系统信息 
    
    [StructLayout( LayoutKind.Sequential )] 
    
    public struct SYSTEM_INFO { 
        
        public uint dwOemId; 
        
        public uint dwPageSize; 
        
        public uint lpMinimumApplicationAddress; 
        
        public uint lpMaximumApplicationAddress; 
        
        public uint dwActiveProcessorMask; 
        
        public uint dwNumberOfProcessors; 
        
        public uint dwProcessorType; 
        
        public uint dwAllocationGranularity; 
        
        public uint dwProcessorLevel; 
        
        public uint dwProcessorRevision; 
        
    } 
    
    //struct 收集内存情况 
    
    [StructLayout( LayoutKind.Sequential )] 
    
    public struct MEMORYSTATUS 
    
    { 
        
        public uint dwLength; 
        
        public uint dwMemoryLoad; 
        
        public uint dwTotalPhys; 
        
        public uint dwAvailPhys; 
        
        public uint dwTotalPageFile; 
        
        public uint dwAvailPageFile; 
        
        public uint dwTotalVirtual; 
        
        public uint dwAvailVirtual; 
        
    } 
    
    public class Form1 : System.WinForms.Form 
    
    { 
        
        private System.ComponentModel.Container components; 
        
        private System.WinForms.MenuItem menuAbout; 
        
        private System.WinForms.MainMenu mainMenu1; 
        
        private System.WinForms.ListBox listBox1; 
        
        private System.WinForms.Button button1; 
        
        //获取系统信息 
        
        [DllImport( "kernel32" )] 
        
        static extern void GetSystemInfo( ref SYSTEM_INFO pSI ); 
        
        //获取内存信息 
        
        [DllImport( "kernel32" )] 
        
        static extern void GlobalMemoryStatus( ref MEMORYSTATUS buf ); 
        
        //处理器类型 
        
        public const int PROCESSOR_INTEL_386 = 386; 
        
        public const int PROCESSOR_INTEL_486 = 486; 
        
        public const int PROCESSOR_INTEL_PENTIUM = 586; 
        
        public const int PROCESSOR_MIPS_R4000 = 4000; 
        
        public const int PROCESSOR_ALPHA_21064 = 21064; 
        
        public Form1( ) 
        
        { 
            
            InitializeComponent( ); 
            
        } 
        
        public override void Dispose( ) 
        
        { 
            
            base.Dispose( ); 
            
            components.Dispose( ); 
            
        } 
        
        private void InitializeComponent( ) 
        
        { 
            
            this.components = new System.ComponentModel.Container ( ); 
            
            this.mainMenu1 = new System.WinForms.MainMenu ( ); 
            
            this.button1 = new System.WinForms.Button ( ); 
            
            this.listBox1 = new System.WinForms.ListBox ( ); 
            
            this.menuAbout = new System.WinForms.MenuItem ( ); 
            
            mainMenu1.MenuItems.All = new System.WinForms.MenuItem[1] {this.menuAbout}; 
            
            button1.Location = new System.Drawing.Point ( 148, 168 ); 
            
            button1.Size = new System.Drawing.Size ( 112, 32 ); 
            
            button1.TabIndex = 0; 
            
            button1.Text = "&Get Info"; 
            
            button1.Click += new System.EventHandler ( this.button1_Click ); 
            
            listBox1.Location = new System.Drawing.Point ( 20, 8 ); 
            
            listBox1.Size = new System.Drawing.Size ( 368, 147 ); 
            
            listBox1.TabIndex = 1; 
            
            menuAbout.Text = "&About"; 
            
            menuAbout.Index = 0; 
            
            menuAbout.Click += new System.EventHandler ( this.menuAbout_Click ); 
            
            this.Text = "System Information - Using API"; 
            
            this.MaximizeBox = false; 
            
            this.AutoScaleBaseSize = new System.Drawing.Size ( 5, 13 ); 
            
            this.MinimizeBox = false; 
            
            this.Menu = this.mainMenu1; 
            
            this.ClientSize = new System.Drawing.Size ( 408, 213 ); 
            
            this.Controls.Add ( this.listBox1 ); 
            
            this.Controls.Add ( this.button1 ); 
            
        } 
        
        protected void menuAbout_Click ( object sender, System.EventArgs e ) 
        
        { 
            
            Form abt=new about( ) ; 
            
            abt.ShowDialog( ); 
            
        } 
        
        protected void button1_Click ( object sender, System.EventArgs e ) 
        
        { 
            
            try 
            
            { 
                
                SYSTEM_INFO pSI = new SYSTEM_INFO( ); 
                
                GetSystemInfo( ref pSI ); 
                
                string CPUType; 
                
                switch ( pSI.dwProcessorType ) 
                
                { 
                    
                    case PROCESSOR_INTEL_386 : 
                    
                    CPUType= "Intel 386"; 
                    
                    break; 
                    
                    case PROCESSOR_INTEL_486 : 
                    
                    CPUType = "Intel 486" ; 
                    
                    break; 
                    
                    case PROCESSOR_INTEL_PENTIUM : 
                    
                    CPUType = "Intel Pentium"; 
                    
                    break; 
                    
                    case PROCESSOR_MIPS_R4000 : 
                    
                    CPUType = "MIPS R4000"; 
                    
                    break; 
                    
                    case PROCESSOR_ALPHA_21064 : 
                    
                    CPUType = "DEC Alpha 21064"; 
                    
                    break; 
                    
                    default : 
                    
                    CPUType = "( unknown )"; 
                    
                } 
                
                listBox1.InsertItem ( 0,"Active Processor Mask :"+pSI.dwActiveProcessorMask.ToString( ) ); 
                
                listBox1.InsertItem ( 1,"Allocation Granularity :"+pSI.dwAllocationGranularity.ToString( ) ); 
                
                listBox1.InsertItem ( 2,"Number Of Processors :"+pSI.dwNumberOfProcessors.ToString( ) ); 
                
                listBox1.InsertItem ( 3,"OEM ID :"+pSI.dwOemId.ToString( ) ); 
                
                listBox1.InsertItem ( 4,"Page Size:"+pSI.dwPageSize.ToString( ) ); 
                
                listBox1.InsertItem ( 5,"Processor Level Value:"+pSI.dwProcessorLevel.ToString( ) ); 
                
                listBox1.InsertItem ( 6,"Processor Revision:"+ pSI.dwProcessorRevision.ToString( ) ); 
                
                listBox1.InsertItem ( 7,"CPU type:"+CPUType ); 
                
                listBox1.InsertItem ( 8,"Maximum Application Address: "+pSI.lpMaximumApplicationAddress.ToString( ) ); 
                
                listBox1.InsertItem ( 9,"Minimum Application Address:" +pSI.lpMinimumApplicationAddress.ToString( ) ); 
                
                /************** 从 GlobalMemoryStatus 获取返回值****************/ 
                
                MEMORYSTATUS memSt = new MEMORYSTATUS ( ); 
                GlobalMemoryStatus ( ref memSt ); 
                
                listBox1.InsertItem( 10,"Available Page File :"+ ( memSt.dwAvailPageFile/1024 ).ToString ( ) ); 
                
                listBox1.InsertItem( 11,"Available Physical Memory : " + ( memSt.dwAvailPhys/1024 ).ToString( ) ); 
                
                listBox1.InsertItem( 12,"Available Virtual Memory:" + ( memSt.dwAvailVirtual/1024 ).ToString ( ) ); 
                
                listBox1.InsertItem( 13,"Size of structur :" + memSt.dwLength.ToString( ) ); 
                
                listBox1.InsertItem( 14,"Memory In Use :"+ memSt.dwMemoryLoad.ToString( ) ); 
                
                listBox1.InsertItem( 15,"Total Page Size :"+ ( memSt.dwTotalPageFile/1024 ).ToString ( ) ); 
                
                listBox1.InsertItem( 16,"Total Physical Memory :" + ( memSt.dwTotalPhys/1024 ).ToString( ) ); 
                
                listBox1.InsertItem( 17,"Total Virtual Memory :" + ( memSt.dwTotalVirtual/1024 ).ToString ( ) ); 
                
            } 
            
            catch( Exception er ) 
            
            { 
                
                MessageBox.Show ( er.Message ); 
                
            } 
            
        } 
        
        public static void Main( string[] args ) 
        
        { 
            
            try 
            
            { 
                
                Application.Run( new Form1( ) ); 
                
            } 
            
            catch( Exception er ) 
            
            { 
                
                MessageBox.Show ( er.Message); 
                
            } 
            
        } 
        
    } 
    
}

C#--API的更多相关文章

  1. 干货来袭-整套完整安全的API接口解决方案

    在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...

  2. 12306官方火车票Api接口

    2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...

  3. 几个有趣的WEB设备API(二)

    浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...

  4. html5 canvas常用api总结(三)--图像变换API

    canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...

  5. JavaScript 对数据处理的5个API

    JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...

  6. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  7. javascript的api设计原则

    前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...

  8. 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

    大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...

  9. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  10. bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

    也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...

随机推荐

  1. 1025关于explain的补充1

    https://segmentfault.com/q/1010000004195469 我的困惑 http://www.cnblogs.com/BeginMan/p/3754322.html 可以指定 ...

  2. 你需要知道的MySQL开源存储引擎TokuDB

    在四月份的Percona Live MySQL会议上, TokuDB庆祝自己成为开源存储引擎整一周年.我现在仍能记得一年前它刚创建时的官方声明与对它的期望.当时的情况非常有意思,因为它拥有帮助MySQ ...

  3. tomcat报错

    错误日志如下: 十月 10, 2016 10:44:57 上午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.serv ...

  4. 【BZOJ 1875】【SDOI 2009】HH去散步

    水啊水,最后ans别忘了%哦! #include<cstdio> #include<cstring> #include<algorithm> using names ...

  5. nginx正向代理,反向代理,透明代理(总结)

    1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连 ...

  6. 状态压缩 HDU 3182

    t组数据 n个汉堡 e的能量 接下来的2行 val    n个 得到的权 cost  n个 花去的能量 接下来n行 每行一个q  q个数字 代表这类汉堡做好要的前提  每个汉堡只能用一次 #inclu ...

  7. springmvc使用RSA算法加密表单

    今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以 ...

  8. 在Eclipse中如何关联spring-framework的文档和源代码

    1.到官方网站去下载spring-framework的jar包 spring-framework jar包的下载地址是:http://repo.spring.io/release/org/spring ...

  9. 【BZOJ-3174】拯救小矮人 贪心 + DP

    3174: [Tjoi2013]拯救小矮人 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 686  Solved: 357[Submit][Status ...

  10. 【poj3709】 K-Anonymous Sequence

    http://poj.org/problem?id=3709 (题目链接) 题意 给出一个n个数的序列,要求将其中一些数改为另一个比它小的数,改动的花费为两数的绝对值,完成改动后使得整个序列中出现过的 ...