vb.net 教程 2-13 Windows API 函数
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)?jiān)陲@著位置標(biāo)明本文出處以及作者網(wǎng)名,未經(jīng)作者允許不得用于商業(yè)目的。
API(Application Programming Interface,應(yīng)用程序編程接口)函數(shù)是提供給開發(fā)人員訪問某個(gè)功能或者硬件的接口。通常情況下,API是封裝在動(dòng)態(tài)鏈接庫(Dll文件)內(nèi)的,
通俗來說,api函數(shù)相當(dāng)于是個(gè)黑匣子,外部的開發(fā)人員通過調(diào)用提供的api函數(shù)而獲得某些功能,而內(nèi)部的開發(fā)人員也不用擔(dān)心泄漏源代碼,也能更好地控制外部開發(fā)人員訪問的權(quán)限。
.net開發(fā)為什么還要調(diào)用api函數(shù)?
相對(duì)于vb6及之前版本,.net框架提供給了開發(fā)者很多功能,但是仍然有相當(dāng)部分系統(tǒng)功能只能通過調(diào)用api完成。
我的理解:從本質(zhì)上來說,.net框架也是調(diào)用的api,不過提供給了開發(fā)人員更為簡(jiǎn)便的方法,開發(fā)者只需要使用.net提供的函數(shù)就可以了。
如何知道系統(tǒng)提供哪些API函數(shù)?
一個(gè)方法是,在vb6中提供了api函數(shù)瀏覽器,實(shí)際可以把這個(gè)有用的東東拷貝使用。
有所區(qū)別的是數(shù)據(jù)類型不一樣。
比如:vb6下的Long(這也是api中常見的類型,指針、句柄都用它)在vb.net中是Integer。
例如:禁用窗口關(guān)閉按鈕相關(guān)的Api函數(shù):
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
翻譯到vb.net中應(yīng)該是:
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Integer)As Integer
其次,可以在網(wǎng)上搜索適合vb.net的相關(guān)api聲明。
如何調(diào)用api函數(shù)
vb.net下提供了兩種方法:
一是按照vb6及之前的方式:
? Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Boolean) As Integer
二是使用DllImport方式
? ? <DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
? ? Private Shared Function GetSystemMenu(ByVal hwnd As Integer, ByVal revert As Integer) As Integer
? ? End Function
使用此方式時(shí)應(yīng)該注意
Imports System.Runtime.InteropServices
同時(shí),“, CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True”并非必須的。
這里以禁用窗口的關(guān)閉按鈕(X)為例:
新建一個(gè)窗口,上面放兩個(gè)按鈕。
定義API函數(shù)部分(第二種方式被我注釋掉,可以把注釋部分取消注釋替換第一種方式):
? ? Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
?
? ? '<DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
? ? 'Private Shared Function GetSystemMenu(ByVal hwnd As Integer, ByVal revert As Integer) As Integer
?
? ? 'End Function
?
? ? Private Declare Function EnableMenuItem Lib "user32.dll" (ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
?
? ? '<DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
? ? 'Private Shared Function EnableMenuItem(ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
?
? ? 'End Function
?
?
? ? Private Const SC_CLOSE As Integer = &HF060
? ? Private Const MF_BYCOMMAND As Integer = &H0
?
? ? Private Const MF_ENABLED As Integer = &H0
? ? Private Const MF_GRAYED As Integer = &H1
? ? Private Const MF_DISABLED As Integer = &H2
? ? Private Const MF_REMOVE = &H1000
按鈕部分:
? ? Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
? ? ? ? Dim result As Integer = GetSystemMenu(Me.Handle, 0)
? ? ? ? Dim result2 As Integer = EnableMenuItem(result, SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED)
? ? End Sub
?
? ? Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
? ? ? ? Dim result As Integer = GetSystemMenu(Me.Handle, 0)
? ? ? ? Dim result2 As Integer = EnableMenuItem(result, SC_CLOSE, MF_BYCOMMAND Or MF_ENABLED)
? ? End Sub
button1使關(guān)閉按鈕禁用,button2恢復(fù)關(guān)閉按鈕。
按下button1時(shí)候:
?
由于.net平臺(tái)下C#和vb.NET很相似,本文也可以為C#愛好者提供參考。
學(xué)習(xí)更多vb.net知識(shí),請(qǐng)參看vb.net教程 目錄
————————————————
版權(quán)聲明:本文為CSDN博主「VB.Net」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
?
總結(jié)
以上是生活随笔為你收集整理的vb.net 教程 2-13 Windows API 函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提示:不建议在没有为偏离分支指定合并策略
- 下一篇: 某游戏在华为鸿蒙,华为鸿蒙系统运行安卓游