vb.net 教程 2-13 Windows API 函数
版權聲明:本文為博主原創文章,轉載請在顯著位置標明本文出處以及作者網名,未經作者允許不得用于商業目的。
API(Application Programming Interface,應用程序編程接口)函數是提供給開發人員訪問某個功能或者硬件的接口。通常情況下,API是封裝在動態鏈接庫(Dll文件)內的,
通俗來說,api函數相當于是個黑匣子,外部的開發人員通過調用提供的api函數而獲得某些功能,而內部的開發人員也不用擔心泄漏源代碼,也能更好地控制外部開發人員訪問的權限。
.net開發為什么還要調用api函數?
相對于vb6及之前版本,.net框架提供給了開發者很多功能,但是仍然有相當部分系統功能只能通過調用api完成。
我的理解:從本質上來說,.net框架也是調用的api,不過提供給了開發人員更為簡便的方法,開發者只需要使用.net提供的函數就可以了。
如何知道系統提供哪些API函數?
一個方法是,在vb6中提供了api函數瀏覽器,實際可以把這個有用的東東拷貝使用。
有所區別的是數據類型不一樣。
比如:vb6下的Long(這也是api中常見的類型,指針、句柄都用它)在vb.net中是Integer。
例如:禁用窗口關閉按鈕相關的Api函數:
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
翻譯到vb.net中應該是:
Private Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Integer, ByVal bRevert As Integer)As Integer
其次,可以在網上搜索適合vb.net的相關api聲明。
如何調用api函數
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
使用此方式時應該注意
Imports System.Runtime.InteropServices
同時,“, CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True”并非必須的。
這里以禁用窗口的關閉按鈕(X)為例:
新建一個窗口,上面放兩個按鈕。
定義API函數部分(第二種方式被我注釋掉,可以把注釋部分取消注釋替換第一種方式):
? ? 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使關閉按鈕禁用,button2恢復關閉按鈕。
按下button1時候:
?
由于.net平臺下C#和vb.NET很相似,本文也可以為C#愛好者提供參考。
學習更多vb.net知識,請參看vb.net教程 目錄
————————————————
版權聲明:本文為CSDN博主「VB.Net」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
?
總結
以上是生活随笔為你收集整理的vb.net 教程 2-13 Windows API 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 提示:不建议在没有为偏离分支指定合并策略
- 下一篇: linux netbeans 中文乱码,