Windows API 是屬於 Windows作系統一部分的動態連結庫(DLL)。 當您難以撰寫自己的對等程式時,您可以使用它們來執行工作。 例如,Windows 提供名為 FlashWindowEx 的函式,可讓您讓應用程式標題欄在淺色和深色陰影之間交替。
在您的程式代碼中使用 Windows API 的優點是,它們可以節省開發時間,因為它們包含數十個已撰寫並等待使用的實用函式。 缺點是,當發生問題時,Windows API 可能很難使用且無情。
Windows API 代表特殊類別的互作性。 Windows API 不使用受控代碼、沒有內建型別庫,並使用與 Visual Studio 搭配使用的資料類型不同。 由於這些差異,而且因為 Windows API 不是 COM 物件,因此會使用平台调用或 PInvoke 來執行與 Windows API 和 .NET Framework 的互作性。 平台調用是一項服務,可讓受控程式碼呼叫在 DLL 中實作的非受控函式。 如需詳細資訊,請參閱 使用 Unmanaged DLL 函式。 您可以在 Visual Basic 中使用 PInvoke,方法是使用 Declare 語句或將 DllImport 屬性套用至空的程式。
在過去,Windows API 呼叫是 Visual Basic 程式設計的重要部分,但在使用 Visual Basic .NET 時,通常不再需要。 盡可能使用 .NET Framework 中的 Managed 程式代碼來執行工作,而不是 Windows API 呼叫。 本指南提供在必要時使用 Windows API 的相關資訊。
備註
您的電腦可能會在下列指示中顯示某些 Visual Studio 使用者介面元素的不同名稱或位置。 您擁有的 Visual Studio 版本,以及您所使用的設定會決定這些元素。 如需詳細資訊,請參閱 個人化 IDE。
使用 Declare 的 API 呼叫
呼叫 Windows API 最常見的方式是使用 Declare 語句。
宣告 DLL 程式
決定您想要呼叫的函式名稱,加上其自變數、自變數類型和傳回值,以及包含它的 DLL 名稱和位置。
備註
如需 Windows API 的完整資訊,請參閱平臺 SDK Windows API 中的 Win32 SDK 檔。 如需 Windows API 使用之常數的詳細資訊,請檢查平臺 SDK 隨附的頭檔,例如 Windows.h。
單擊 [檔案] 功能表上的 [新增],然後單擊 [專案],以開啟新的 Windows 應用程式專案。 [新增專案] 對話方塊隨即出現。
從 Visual Basic 專案範本清單中選取 [Windows 應用程式 ]。 顯示新的專案。
將下列
Declare函式新增至您要在其中使用 DLL 的類別或模組:Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" ( ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, ByVal Typ As Integer) As Integer
Declare 陳述式的各個部分
Declare語句包含下列元素。
自動修飾詞
Auto修飾詞會指示執行階段根據通用語言執行階段規則轉換字串(或如有指定,則使用別名名稱)。
Lib 和 Alias 關鍵詞
關鍵詞後面的 Function 名稱是程式用來存取匯入函式的名稱。 它可以與您呼叫之函式的實名相同,或者您可以使用任何有效的程式名稱,然後使用 Alias 關鍵詞來指定您呼叫之函式的實名。
指定 Lib 關鍵詞,接著是包含您要呼叫的函式之 DLL 的名稱和位置。 您不需要指定 Windows 系統目錄中檔案的路徑。
Alias如果您要呼叫的函式名稱不是有效的 Visual Basic 程式名稱,或與應用程式中其他專案的名稱衝突,請使用 關鍵詞。
Alias 表示所呼叫函式的真實名稱。
引數和資料型別宣告
宣告自變數及其數據類型。 因為 Windows 所使用的數據類型未對應至 Visual Studio 數據類型,因此這個部分可能會很困難。 Visual Basic 替您完成許多工作,它會將參數轉換為相容的資料類型,此過程稱為封送處理。 您可以使用在MarshalAsAttribute命名空間中定義的System.Runtime.InteropServices屬性來明確控制參數的封送處理方式。
備註
舊版的Visual Basic可讓您宣告參數 As Any,這表示可以使用任何數據類型的數據。 Visual Basic 會要求您針對所有 Declare 語句使用特定的數據類型。
Windows API 常數
某些自變數是常數的組合。 例如, MessageBox 本逐步解說中顯示的 API 接受名為 Typ 的整數自變數,控制消息框的顯示方式。 您可以檢查 #define WinUser.h 檔案中的 語句,以判斷這些常數的數值。 數值通常會以十六進位顯示,因此您可能想要使用計算機來新增數值並轉換成十進位。 例如,如果您想要結合驚嘆號樣式 MB_ICONEXCLAMATION 的常數0x00000030和 [是/否] 樣式 MB_YESNO 0x00000004,您可以新增數位並取得0x00000034的結果,或 52 個小數位數。 雖然您可以直接使用十進制結果,但最好將這些值宣告為應用程式中的常數,並使用 Or 運算符加以結合。
宣告 Windows API 呼叫的常數
請參閱您所呼叫的 Windows 功能之文件。 判斷它所使用的常數名稱,以及包含這些常數之數值的 .h 檔名稱。
使用記事本等文本編輯器來檢視標頭 (.h) 檔案的內容,並尋找與您所使用的常數相關聯的值。 例如,
MessageBoxAPI 會使用 常數MB_ICONQUESTION在消息框中顯示問號。 的定義MB_ICONQUESTION位於 WinUser.h 中,如下所示:#define MB_ICONQUESTION 0x00000020L將對等
Const語句新增至您的類別或模組,讓這些常數可供您的應用程式使用。 例如:Const MB_ICONQUESTION As Integer = &H20 Const MB_YESNO As Integer = &H4 Const IDYES As Integer = 6 Const IDNO As Integer = 7
呼叫 DLL 程序
將名為
Button1的按鈕新增至專案的啟動窗體,然後按兩下它以檢視其程式代碼。 按鈕的事件處理程式隨即顯示。將程式代碼新增至
Click您所新增按鈕的事件處理程式,以呼叫程式並提供適當的自變數:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Stores the return value. Dim RetVal As Integer RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", MB_ICONQUESTION Or MB_YESNO) ' Check the return value. If RetVal = IDYES Then MsgBox("You chose Yes") Else MsgBox("You chose No") End If End Sub按 F5 執行專案。 消息框會顯示 [ 是 ] 和 [ 無 回應] 按鈕。 點擊任一個。
數據整理
Visual Basic 會自動轉換 Windows API 呼叫的參數數據類型和傳回值,但您可以使用 MarshalAs 屬性來明確指定 API 預期的 Unmanaged 數據類型。 如需 Interop 封送處理的詳細資訊,請參閱 Interop 封送處理。
在 API 呼叫中使用 Declare 和 MarshalAs
決定您想要呼叫的函式名稱,加上其自變數、數據類型和傳回值。
若要簡化屬性的
MarshalAs存取,請將 語句新增Imports至類別或模組的程式代碼頂端,如下列範例所示:Imports System.Runtime.InteropServices將匯入函式的函式原型新增至您使用的類別或模組,並將 屬性套用
MarshalAs至參數或傳回值。 在下列範例中,API 呼叫預期的類型為void*,會被封送處理成AsAny:Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)
使用 DllImport 的 API 呼叫
屬性 DllImport 提供第二種方式來呼叫沒有類型連結庫的 DLL 中的函式。
DllImport 大致相當於使用 Declare 語句,但提供對函式呼叫方式的更多控制權。
您可以搭配大部分的 Windows API 呼叫使用DllImport,只要該呼叫是參考共用的(有時稱為靜態)方法。 您無法使用需要 類別實例的方法。 不同於 Declare 語句, DllImport 呼叫無法使用 MarshalAs 屬性。
使用 DllImport 屬性呼叫 Windows API
單擊 [檔案] 功能表上的 [新增],然後單擊 [專案],以開啟新的 Windows 應用程式專案。 [新增專案] 對話方塊隨即出現。
從 Visual Basic 專案範本清單中選取 [Windows 應用程式 ]。 顯示新的專案。
將名為
Button2的按鈕新增至啟動表單。按兩下
Button2以開啟表單的程式代碼檢視。若要簡化對
DllImport的存取,請在啟動表單類別的程式代碼頂端新增Imports語句陳述:Imports System.Runtime.InteropServices在表單的語句前面
End Class宣告空函式,並將函式MoveFile命名為 。根據 Windows API 函數所使用的引數,將
Public和Shared修飾詞套用至函數宣告,並設定MoveFile的參數。Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End Function您的函式可以具有任何有效的程序名稱;屬性
DllImport會指定 DLL 中的名稱。 它也會處理參數和傳回值的互作性封送處理,因此您可以選擇與 API 所使用的數據類型類似的 Visual Studio 數據類型。將
DllImport屬性套用至空白函式。 第一個參數是 DLL 的名稱和位置,其中包含您要呼叫的函式。 您不需要指定 Windows 系統目錄中檔案的路徑。 第二個參數是指定 Windows API 中函式名稱的具名自變數。 在此範例中,DllImport屬性會強制將對MoveFile的呼叫轉送至 KERNEL32.DLL 中的MoveFileW。 方法MoveFileW會將檔案從路徑src複製到路徑dst。<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End Function將程式代碼新增至
Button2_Click事件處理程式以呼叫 函式:Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt") If RetVal = True Then MsgBox("The file was moved successfully.") Else MsgBox("The file could not be moved.") End If End Sub建立名為 Test.txt 的檔案,並將它放在硬碟上的 C:\Tmp 目錄中。 如有必要,請建立 Tmp 目錄。
按 F5 以啟動應用程式。 主要窗體隨即出現。
按兩下 [按鈕2]。 如果可以移動檔案,則會顯示「已成功移動檔案」訊息。