Windows API就是Windows系統(tǒng)的API函數(shù)簡(jiǎn)稱(Application Program Interface 即 應(yīng)用程序接口函數(shù)) 它是Windows操作系統(tǒng)提供給各種開發(fā)基于Windows平臺(tái)應(yīng)用軟件的開發(fā)語(yǔ)言的一些公用的函數(shù) 這些函數(shù)一般都比較底層 所以當(dāng)各種開發(fā)語(yǔ)言使用自帶的函數(shù)或類庫(kù)已無(wú)法解決問(wèn)題時(shí) 調(diào)用Windows API函數(shù)往往是一種非常直型迅接 有效的解決方法 但由于在程序中調(diào)用Windows API函數(shù)一般都很復(fù)雜 所以對(duì)于程序員來(lái)說(shuō) 是否能夠靈活的使用Windows API函數(shù) 往往也是其水平高低的一個(gè)重要標(biāo)志 但自從微軟推出 Net框架以后 各種開發(fā)基于 Net平臺(tái)下的程序語(yǔ)言 如Visual Basic Net Visual C#等卻很少使用Windows API函數(shù) 并且微軟公司也不像以前叢睜那樣 提倡在這些 Net開發(fā)語(yǔ)言中使用Windows API函數(shù) 其主要的原因如下 Net框架所附帶的類庫(kù) Net FrameWork SDK是一個(gè)內(nèi)容豐富 功能強(qiáng)大的軟件開發(fā)包 各種Windows API函數(shù)所實(shí)現(xiàn)的各種功能幾乎都可以在這個(gè)軟件開發(fā)包中找到與之對(duì)應(yīng)的部分 微軟Visual Basic Net Visual C#等目的是編寫跨平臺(tái)的應(yīng)用程序 如果在Visual Basic Net Visual C#等中使用Windows API函數(shù) 這也就注定了編寫出的程序只能運(yùn)行于Windows平臺(tái)之下 而弱化了 NET的跨平臺(tái)能力 這也就是為什么微軟不提倡在 Net平臺(tái)調(diào)用Windows API函數(shù)的原因 雖然微軟并不提倡在Visual Basic Net Visual C#中調(diào)用Windows API函數(shù) 但由于目前 Net 框架推出時(shí)間較短 Net FrameWork SDK中提供的類庫(kù)還并不足以完全替換Windows API函數(shù)的所有功能 所以在某些時(shí)候 Net開發(fā)語(yǔ)言還是必須要調(diào)用Windows API函數(shù) 一 平臺(tái)調(diào)用 托管DLL 非托管DLL簡(jiǎn)介 托管DLL就是能夠在公共語(yǔ)言運(yùn)行庫(kù)(Common Language Runtime 簡(jiǎn)稱CLR)中能夠直接引用的 并且擴(kuò)展名為 DLL 的文件 具體所指就是封裝各種命名空間所在的DLL文卜鄭此件 如System dll等 非托管DLL就是平常所的動(dòng)態(tài)鏈接庫(kù)等 其中就包括了封裝所有Windows API函數(shù)的DLL文件 各種非托管DLL中的函數(shù)在公共語(yǔ)言運(yùn)行庫(kù)中不能直接被調(diào)用 而需要經(jīng)過(guò) Net框架提供的 平臺(tái)調(diào)用 服務(wù)后才可以 平臺(tái)調(diào)用 是 Net框架為Visual Basic Net Visual C#等 Net開發(fā)語(yǔ)言提供的一種服務(wù) 用以在托管代碼中引入各種非托管DLL中封裝的函數(shù)(其中包括Windows API函數(shù)) 平臺(tái)調(diào)用 依賴于元數(shù)據(jù)在運(yùn)行時(shí)查找導(dǎo)出函數(shù)并封裝其參數(shù) 圖 公共語(yǔ)言運(yùn)行庫(kù)利用 平臺(tái)服務(wù) 調(diào)用非托管DLL中的函數(shù)的流程圖 圖 平臺(tái)服務(wù) 的調(diào)用非托管函數(shù)的流程圖在托管代碼中使用 平臺(tái)調(diào)用 服務(wù)調(diào)用非托管DLL中封裝的函數(shù)時(shí) 平臺(tái)服務(wù) 將依次執(zhí)行以下操作 . 查找包含該函數(shù)所在的DLL文件 . 如果找到 則將該DLL文件 加載到內(nèi)存中 . 查找函數(shù)在內(nèi)存中的地址并將其參數(shù)推到堆棧上 并封送所需的數(shù)據(jù) . 將控制權(quán)轉(zhuǎn)移給非托管函數(shù) 這樣整個(gè)函數(shù)調(diào)用完成 在Visual Basic Net中使用 平臺(tái)調(diào)用 服務(wù) 申明Windows API函數(shù)主要有二種具體的實(shí)現(xiàn)方法 . 使用DllImport特征類來(lái)申明Windows API函數(shù) . 使用 Declare 語(yǔ)句來(lái)申明Windows API函數(shù) 這二種方法雖有異曲同工之效 但在繁簡(jiǎn)上卻有很大差異 第一種方法申明過(guò)程比較復(fù)雜 很容易在申明Windows API函數(shù)時(shí)出錯(cuò) 所以并不提倡 而第二種方法相對(duì)簡(jiǎn)單 并且又保存了以前Visual Basic中的很多語(yǔ)法 所以在平常時(shí)大都使用這種方法來(lái)申明Windows API函數(shù) 二.VB Net查看文件中圖標(biāo)的函數(shù)及申明Windows API的方法 Visual Basic Net要實(shí)現(xiàn)查看文件中的圖標(biāo) 目前只使用 Net FrameWork SDK是無(wú)法實(shí)現(xiàn)這種功能的 正如前面所說(shuō) 主要是由于 Net FrameWork SDK推出的時(shí)間較短 其功能還不可能面面俱到 解決問(wèn)題的關(guān)鍵是正確使用Windows API函數(shù) 其中所涉及到的Windows API函數(shù)主要有二個(gè) 其一是獲得指定文件中的圖標(biāo)數(shù)目 其二是從指定文件的指定位置導(dǎo)出圖標(biāo)的Windows句柄 這二個(gè)函數(shù)都位于 Shell dll 文件中 并且函數(shù)的入口點(diǎn)都為 ExtractIcon 下面是在Visual Basic Net中分別使用DllImport特征類和 Declare 語(yǔ)句申明這二個(gè)Windows API函數(shù)的具體方法 ( ) 使用DllImport特征類來(lái)申明Windows API函數(shù) 下面是在Visual Basic Net中使用DllImport特征類申明二個(gè)Windows API函數(shù)的具體示例 函數(shù)ExtractIcon 其功能是是從指定文件的指定位置導(dǎo)出圖標(biāo)的Windows句柄 < System Runtime InteropServices DllImport ( Shell dll EntryPoint := ExtractIcon ) > _Public Function _ExtractIcon ( ByVal src As System IntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As System IntPtrEnd Function 函數(shù)Icon_Num 其功能是獲得指定文件中的圖標(biāo)數(shù)目< System Runtime InteropServices DllImport ( Shell dll EntryPoint := ExtractIcon ) > _Public Function _Icon_Num ( ByVal src As System IntPtr ByVal strFileName As string ByVal uiIconIndex As Integer ) As IntegerEnd Function在使用DllImport特征類申明Windows API函數(shù)時(shí) 如果申明的函數(shù)名稱和函數(shù)的入口點(diǎn)相同 則可以在申明Windows API函數(shù)時(shí) 省略定義函數(shù)入口點(diǎn)對(duì)應(yīng)的代碼 即EntryPoint對(duì)象字段對(duì)應(yīng)的代碼 這樣聲明ExtractIcon函數(shù)的代碼也可以簡(jiǎn)化為如下所示 < System Runtime InteropServices DllImport ( Shell dll ) > _Public Function _ExtractIcon ( ByVal src As System IntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As System IntPtrEnd Function( ) 使用 Declare 語(yǔ)句來(lái)申明Windows API函數(shù) 使用 Declare 語(yǔ)句的確比使用DllImport特征類要簡(jiǎn)單了許多 下面是在Visual Basic Net中使用 Declare 語(yǔ)句來(lái)聲明上述二個(gè)Windows API函數(shù)的具體方法 Declare Auto Function ExtractIcon Lib Shell dll Alias ExtractIcon ( ByVal src As System IntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As System IntPtr 聲明ExtractIcon函數(shù)Declare Auto Function Icon_Num Lib Shell dll Alias ExtractIcon ( ByVal src As System IntPtr ByVal strFileName As string ByVal uiIconIndex As Integer ) As Integer 聲明Icon_Num函數(shù)在Visual Basic Net中聲明Windows API函數(shù)時(shí) Declare 語(yǔ)句中Alias關(guān)鍵字的作用相當(dāng)于使用DllImport特征類中的EntryPoint對(duì)象字段 同樣在使用 Declare 語(yǔ)句聲明Windows API函數(shù)時(shí) 如果聲明的函數(shù)和函數(shù)的入口點(diǎn)相同 也可以省略Alias關(guān)鍵字對(duì)應(yīng)的代碼 所以ExtractIcon函數(shù)也可以簡(jiǎn)化為如下 Declare Auto Function ExtractIcon Lib Shell dll ( ByVal src As System IntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As System IntPtr下面就結(jié)合一個(gè)示例的編寫過(guò)程來(lái)掌握的這二個(gè)Windows API函數(shù)的具體使用方法 這個(gè)示例的作用就是讀取指定文件中的圖標(biāo)數(shù)目 并顯示文件中的圖標(biāo) 三.本文中程序的編寫 調(diào)試和運(yùn)行環(huán)境 ( ) 視窗 高級(jí)服務(wù)器版 ( ) Visual Studio Net 企業(yè)結(jié)構(gòu)設(shè)計(jì)版 Net FrameWork SDK版本號(hào) 四.Visual Basic Net讀取文件中的圖標(biāo)的實(shí)現(xiàn)步驟 下面介紹的示例 其功能讀取指定文件中包含的圖標(biāo)數(shù)目 并把這些圖標(biāo)全部顯示出來(lái) 下面是這個(gè)示例的實(shí)現(xiàn)步驟 啟動(dòng)Visual Studio Net 選擇菜單【文件】|【新建】|【項(xiàng)目】后 彈出【新建項(xiàng)目】對(duì)話框 將【項(xiàng)目類型】設(shè)置為【Visual Basic項(xiàng)目】 將【模板】設(shè)置為【W(wǎng)indows應(yīng)用程序】 在【名稱】文本框中輸入【Visual Basic Net查看文件中的圖標(biāo)】 在【位置】的文本框中輸入【E:\VS NET項(xiàng)目】 然后單擊【確定】按鈕 這樣在【E:\VS NET項(xiàng)目】目錄中就產(chǎn)生了名稱為【Visual Basic Net查看文件中的圖標(biāo)】文件夾 里面存放著【Visual Basic Net查看文件中的圖標(biāo)】項(xiàng)目的所有文件 具體如圖 所示 圖 【Visual Basic Net查看文件中的圖標(biāo)】項(xiàng)目的【新建項(xiàng)目】對(duì)話框 選擇菜單【項(xiàng)目】|【添加新項(xiàng)】 在彈出的對(duì)話框中的【模板】設(shè)置為【模塊】 【名稱】文本框設(shè)置為【Module vb】后 單擊【打開】按鈕 則在項(xiàng)目中增加了一個(gè)模板文件 名稱為【Module vb】 把Visual Stuido Net的當(dāng)前窗口切換到Module vb的代碼編輯窗口 并在其Module 的代碼區(qū)中添加下列代碼 下列代碼是用二種方式聲明二個(gè)Windows API函數(shù) < System Runtime InteropServices DllImport ( Shell dll ) > _Public Function _ExtractIcon ( ByVal src As System IntPtr ByVal strFileName As String ByVal uiIconIndex As UInt ) As System IntPtrEnd Function 聲明ExtractIcon函數(shù)Declare Auto Function Icon_Num Lib Shell dll Alias ExtractIcon ( ByVal src As System IntPtr ByVal strFileName As String ByVal uiIconIndex As Integer ) As Integer 把Visual Studio Net的當(dāng)前窗口切換到Form 窗體的設(shè)計(jì)查看 并從【工具箱】中的【W(wǎng)indows窗體】選項(xiàng)卡中拖入下列組件到Form 窗體 四個(gè)Label組件 其中二個(gè)用以顯示提示信息 另外二個(gè)分別用以顯示選擇的文件名稱和這個(gè)文件中包含的圖標(biāo)數(shù)目 一個(gè)ListView組件 利用其顯示大圖標(biāo)的屬性用以顯示選定文件中的圖標(biāo) 一個(gè)OpenFileDialog組件 用以選擇要查看圖標(biāo)的文件名稱 一個(gè)ImageList組件 它起的是橋梁的作用 首先把從文件中導(dǎo)出的圖標(biāo)存放到這里 然后再提供ListView組件顯示出來(lái) 一個(gè)Button組件 按照表 中數(shù)值來(lái)設(shè)定設(shè)定組件的主要屬性 組件類型 組件名稱 屬性 設(shè)置結(jié)果 Form Form Text VB NET查看文件中的圖標(biāo) Form MaximizeBox False Form MinimizeBox False Form FormBorderStyle FixedSingle ListView ListView ImageList LargeImageList ListView MultiSelect False ListView Size Size ( ) Button Button Text 選擇文件 Button FlatStyle Flat ImageList ImageList Size Size ( ) ImageList TransparentColor Color Transparent Label Label Text 文件名稱 Label Text 圖標(biāo)數(shù)目 Label Text Label Text 表 【Visual Basic Net查看文件中的圖標(biāo)】項(xiàng)目窗體中各組件的主要屬性設(shè)定數(shù)值表并按照?qǐng)D 中各組件的位置 大小和排列方式來(lái)調(diào)整窗體中各個(gè)組件 圖 【Visual Basic Net查看文件中的圖標(biāo)】項(xiàng)目的設(shè)計(jì)界面 把Visual Studio Net當(dāng)前窗口切換到Form vb的代碼編輯窗口 并用下列代碼替換Form vb中的Button 組件的Click事件的處理代碼 下列代碼是在Button 組件的Click事件中處理查看文件中圖標(biāo)的功能 具體如下 Private Sub Button _Click ( ByVal sender As System Object ByVal e As System EventArgs ) Handles Button ClickIf OpenFileDialog ShowDialog ( ) = DialogResult OK Then 清除組件中的所有項(xiàng)目 ListView Items Clear ( ) ImageList Images Clear ( ) Dim sfName As String = OpenFileDialog FileName Label Text = sfName Dim iIcon_Num As Integer = Icon_Num ( IntPtr Zero sfName ) 顯示文件中的圖標(biāo)數(shù)目 Label Text = iIcon_Num ToString ( ) Dim i As Integer For i = To iIcon_Num Step 強(qiáng)制實(shí)現(xiàn)int到uint類型轉(zhuǎn)換Dim j As UInt j = System Convert ToUInt ( i )Dim hIcon As System IntPtr = ExtractIcon ( IntPtr Zero sfName j ) 在imageList 組件中加入當(dāng)然提取的圖標(biāo)ImageList Images Add ( Icon FromHandle ( hIcon ) ToBitmap ( ) ) 在ListView組件中加入一個(gè)項(xiàng)目ListView Items Add ( 第 + ( i + ) ToString ( ) + 個(gè)圖標(biāo) ) 把加入項(xiàng)目的圖象索引指向剛才加入圖標(biāo)在imagList 組件中的索引 從而顯示圖標(biāo)ListView Items ( i ) ImageIndex = i Next iEnd IfEnd Sub 至此 在上述步驟都正確執(zhí)行后 【Visual Basic Net查看文件中的圖標(biāo)】項(xiàng)目的全部工作就完成了 單擊快捷鍵F 就可以運(yùn)行程序 此時(shí)單擊【選擇文件】按鈕選擇文件后 程序就能夠讀取這個(gè)文件中的圖標(biāo)及其數(shù)目 并顯示出來(lái)了 具體如圖 所示 圖 【Visual Basic Net查看文件中的圖標(biāo)】項(xiàng)目的運(yùn)行界面 五.總結(jié) 解決Visual Basic Net查看文件中的圖標(biāo)的關(guān)鍵并非是使用 Net框架中提供的類庫(kù) 而是使用Windows的API函數(shù) 雖然這與利用Visual Basic Net開發(fā)跨平臺(tái)程序的初衷相違背 但的確不失為一種解決問(wèn)題的方法 有些時(shí)候通過(guò)Windows API函數(shù)能夠快捷 方便的解決實(shí)際問(wèn)題 而這往往是只使用 Net FrameWork SDK所望塵莫及的 但隨著 Net FrameWork SDK內(nèi)容的不斷豐富 各種新的組成部分和新的功能不斷加入 可以預(yù)見(jiàn)的是 在未來(lái)的 Net FrameWork SDK中必將擁有可以替換本文中介紹的二個(gè)Windows API函數(shù)的組成部分 lishixinzhi/Article/program/net/201311/12511
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、峨眉山網(wǎng)絡(luò)推廣、微信小程序定制開發(fā)、峨眉山網(wǎng)絡(luò)營(yíng)銷、峨眉山企業(yè)策劃、峨眉山品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供峨眉山建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
1.Windows的API有兩個(gè)版本的,比如ANSI的FindWindowA(),Unicode的FindWindowW()
2.兩種聲明答迅的清態(tài)此方式
DllImport("user32.dll"閉敬, CharSet:=CharSet.Auto, EntryPoint:="FindWindow") _
Shared Function FindWindow(ByVal className As String, ByVal windowName As String) As IntPtr
End Function
Declare Auto Function FindWindow Lib "user32.dll" Alias "FindWindow" (ByVal className As String, ByVal windowName As String) As IntPtr
(1).使用DllImport特征類來(lái)申明Windows API函數(shù):
下面是在Visual Basic .Net中使用DllImport特征類申明二個(gè)Windows API函數(shù)的具體示例:
'函數(shù)ExtractIcon,其功能是是從指定文件的指定位置導(dǎo)出圖標(biāo)的Windows句柄。
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
ExtractIcon ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function
'函數(shù)Icon_Num,其功能是獲得賣侍指定文件中的圖標(biāo)數(shù)目
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
Icon_Num ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer
End Function
在使用DllImport特征類申明Windows API函數(shù)時(shí),如果申明的函數(shù)名稱和函數(shù)的入口點(diǎn)相同,則可以在申明Windows API函數(shù)時(shí),省略定義函數(shù)入口點(diǎn)對(duì)應(yīng)的代碼,即EntryPoint對(duì)象字段對(duì)應(yīng)的代碼,這樣聲明ExtractIcon函數(shù)的代碼也可以簡(jiǎn)化為如下所示:
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" ) > _
Public Function _
ExtractIcon ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function
(2).使用“Declare”語(yǔ)句來(lái)申明Windows API函數(shù):
使用“Declare”語(yǔ)句的確比使用DllImport特征類要簡(jiǎn)單了許多,下面是在Visual Basic .Net中使用“Declare”語(yǔ)句來(lái)聲明上述二個(gè)Windows API函數(shù)的具體方法:
Declare Auto Function ExtractIcon Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
'聲明ExtractIcon函數(shù)
Declare Auto Function Icon_Num Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer
'聲明Icon_Num函數(shù)
在Visual Basic .Net中聲明渣配讓W(xué)indows API函數(shù)時(shí),“Declare”語(yǔ)句中Alias關(guān)鍵字的作用相如局當(dāng)于使用DllImport特征類中的EntryPoint對(duì)象字段。同樣在使用“Declare”語(yǔ)句聲明Windows API函數(shù)時(shí),如果聲明的函數(shù)和函數(shù)的入口點(diǎn)相同,也可以省略Alias關(guān)鍵字對(duì)應(yīng)的代碼,所以ExtractIcon函數(shù)也可以簡(jiǎn)化為如下:
Declare Auto Function ExtractIcon Lib "Shell32.dll" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr