C# Windows API介绍与调用
Windows API介紹:
????????Windows API 就是 windows應(yīng)用程序接口,是針對(duì)microsoft windows操作系統(tǒng)家族的系統(tǒng)編程接口。
API函數(shù)分類:
1.基礎(chǔ)服務(wù)(Base Services)
? 提供對(duì)Windows系統(tǒng)可用的基礎(chǔ)資源的訪問接口。比如象:文件系統(tǒng)(file system)、外部設(shè)備(device)、,進(jìn)程(process)、線程(thread)以及訪問注冊(cè)表(Windows registry)和錯(cuò)誤處理機(jī)制(error handling)。這些功能接口位于,16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系統(tǒng)文檔中;以及32位Windows下的 kernel32.dll和advapi32.dll中。
2.圖形設(shè)備接口(GDI)
? 提供功能為:輸出圖形內(nèi)容到顯示器、打印機(jī)以及其他外部輸出設(shè)備。它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.dll。
3.圖形化用戶界面(GUI)
? 提供的功能有創(chuàng)建和管理屏幕和大多數(shù)基本控件(control),比如按鈕和滾動(dòng)條。接收鼠標(biāo)和鍵盤輸入,以及其他與GUI有關(guān)的功能。這些調(diào)用接口位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。從Windows XP版本之后,基本控件和通用對(duì)話框控件(Common Control Library)的調(diào)用接口放在comctl32.dll中。
4.通用對(duì)話框鏈接庫(Common Dialog Box Library)
? 為應(yīng)用程序提供標(biāo)準(zhǔn)對(duì)話框,比如打開/保存文檔對(duì)話框、顏色對(duì)話框和字體對(duì)話框等等。這個(gè)鏈接庫位于:16位Windows下的commdlg.dll中,以及32位Windows下comdlg32.dll中。它被歸類為User Interface API之下。
5.通用控件鏈接庫(Common Control Library)
? 為應(yīng)用程序提供接口來訪問操作系統(tǒng)提供的一些高級(jí)控件。比如像:狀態(tài)欄(status bar)、進(jìn)度條(progress bars)、工具欄(toolbar)和標(biāo)簽(tab)。這個(gè)鏈接庫位于:16位Windows下的commctrl.dll中,以及32位Windows下comctl32.dll中。。它被歸類為User Interface API之下。
6.Windows外殼(Windows Shell)
? 作為Windows API的組成部分,不僅允許應(yīng)用程序訪問Windows外殼提供的功能,還對(duì)之有所改進(jìn)和增強(qiáng)。它位于16位Windows下的shell.dll中,以及32位Windows下的shell32.dll中(Windows 95則在 shlwapi.dll中)。 它被歸類為User Interface API之下。
7.網(wǎng)絡(luò)服務(wù)(Network Services)
? 為訪問操作系統(tǒng)提供的多種網(wǎng)絡(luò) 功能提供接口。它包括NetBIOS、Winsock、NetDDE及RPC等。
C#調(diào)用windows API通常有2種方法:
非托管方法: 直接調(diào)用從 DLL 導(dǎo)出的函數(shù)
托管方法:調(diào)用 COM 對(duì)象上的接口方法(如添加office引用Microsoft.Office.Interop.Word)
調(diào)用格式:
using System.Runtime.InteropServices; //引用此名稱空間,簡(jiǎn)化后面的代碼 ... //使用DllImportAttribute特性來引入api函數(shù),注意聲明的是空方法,即方法體為空。 [DllImport("user32.dll")] public static extern ReturnType FunctionName(type arg1,type arg2,...); //調(diào)用時(shí)與調(diào)用其他方法并無區(qū)別,可以使用字段進(jìn)一步說明特性,用逗號(hào)隔開,如: [ DllImport( "kernel32", EntryPoint="GetVersionEx" )]DllImportAttribute特性的公共字段如下:
1、CallingConvention 指示向非托管實(shí)現(xiàn)傳遞方法參數(shù)時(shí)所用的 CallingConvention 值。
CallingConvention.Cdecl : 調(diào)用方清理堆棧。它使您能夠調(diào)用具有 varargs 的函數(shù)。
CallingConvention.StdCall : 被調(diào)用方清理堆棧。它是從托管代碼調(diào)用非托管函數(shù)的默認(rèn)約定。
2、CharSet 控制調(diào)用函數(shù)的名稱版本及指示如何向方法封送 String 參數(shù)。
此字段被設(shè)置為 CharSet 值之一。如果 CharSet 字段設(shè)置為 Unicode,則所有字符串參數(shù)在傳遞到非托管實(shí)現(xiàn)之前都轉(zhuǎn)換成 Unicode 字符。這還導(dǎo)致向 DLL EntryPoint 的名稱中追加字母“W”。如果此字段設(shè)置為 Ansi,則字符串將轉(zhuǎn)換成 ANSI 字符串,同時(shí)向 DLL EntryPoint 的名稱中追加字母“A”。
大多數(shù) Win32 API 使用這種追加“W”或“A”的約定。如果 CharSet 設(shè)置為 Auto,則這種轉(zhuǎn)換就是與平臺(tái)有關(guān)的(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。CharSet 的默認(rèn)值為 Ansi。CharSet 字段也用于確定將從指定的 DLL 導(dǎo)入哪個(gè)版本的函數(shù)。
CharSet.Ansi 和 CharSet.Unicode 的名稱匹配規(guī)則大不相同。對(duì)于 Ansi 來說,如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話,則返回“MyMethod”。如果 DLL 中沒有“MyMethod”,但存在“MyMethodA”,則返回“MyMethodA”。
對(duì)于 Unicode 來說則正好相反。如果將 EntryPoint 設(shè)置為“MyMethod”且它存在的話,則返回“MyMethodW”。如果 DLL 中不存在“MyMethodW”,但存在“MyMethod”,則返回“MyMethod”。如果使用的是 Auto,則匹配規(guī)則與平臺(tái)有關(guān)(在 Windows NT 上為 Unicode,在 Windows 98 上為 Ansi)。如果 ExactSpelling 設(shè)置為 true,則只有當(dāng) DLL 中存在“MyMethod”時(shí)才返回“MyMethod”。
3、EntryPoint 指示要調(diào)用的 DLL 入口點(diǎn)的名稱或序號(hào)。
如果你的方法名不想與api函數(shù)同名的話,一定要指定此參數(shù),例如:
4、ExactSpelling 指示是否應(yīng)修改非托管 DLL 中的入口點(diǎn)的名稱,以與 CharSet 字段中指定的 CharSet 值相對(duì)應(yīng)。如果為 true,則當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Ansi 值時(shí),向方法名稱中追加字母 A,當(dāng) DllImportAttribute.CharSet 字段設(shè)置為 CharSet 的 Unicode 值時(shí),向方法的名稱中追加字母 W。此字段的默認(rèn)值是 false。
5、PreserveSig 指示托管方法簽名不應(yīng)轉(zhuǎn)換成返回 HRESULT、并且可能有一個(gè)對(duì)應(yīng)于返回值的附加 [out, retval] 參數(shù)的非托管簽名。
6、SetLastError 指示被調(diào)用方在從屬性化方法返回之前將調(diào)用 Win32 API SetLastError。 true 指示調(diào)用方將調(diào)用 SetLastError,默認(rèn)為 false。運(yùn)行時(shí)封送拆收器將調(diào)用 GetLastError 并緩存返回的值,以防其被其他 API 調(diào)用重寫。用戶可通過調(diào)用 GetLastWin32Error 來檢索錯(cuò)誤代碼。
二、參數(shù)類型:
1、數(shù)值型直接用對(duì)應(yīng)的就可。(DWORD -> int , WORD -> Int16)
2、API中字符串指針類型 -> .net中string
3、API中句柄 (dWord) ?-> .net中IntPtr
4、API中結(jié)構(gòu) ? -> .net中結(jié)構(gòu)或者類。注意這種情況下,要先用StructLayout特性限定聲明結(jié)構(gòu)或類
公共語言運(yùn)行庫利用StructLayoutAttribute控制類或結(jié)構(gòu)的數(shù)據(jù)字段在托管內(nèi)存中的物理布局,即類或結(jié)構(gòu)需要按某種方式排列。如果要將類傳遞給需要指定布局的非托管代碼,則顯式控制類布局是重要的。它的構(gòu)造函數(shù)中用LayoutKind值初始化 StructLayoutAttribute 類的新實(shí)例。 LayoutKind.Sequential 用于強(qiáng)制將成員按其出現(xiàn)的順序進(jìn)行順序布局。
LayoutKind.Explicit 用于控制每個(gè)數(shù)據(jù)成員的精確位置。利用 Explicit, 每個(gè)成員必須使用 FieldOffsetAttribute 指示此字段在類型中的位置。如:
參考:
https://www.jb51.net/article/46041.htm
Windows API 參考手冊(cè)
https://blog.csdn.net/joycesunny/article/details/91373963
總結(jié)
以上是生活随笔為你收集整理的C# Windows API介绍与调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云栖科技评论第63期:有了AI,世界杯更
- 下一篇: C#基础教程(一).NET框架