.net随笔-vb.net打开外部程序发送键盘信号(2)
調用 Windows Api
indows Api 是動態鏈接庫 (Dll) 的 Windows 操作系統的一部分。 您可以使用它們來執行任務時很難編寫你自己的等效過程。 例如,Windows 提供了一個名為函數FlashWindowEx允許您進行應用程序的標題欄在淺色和深色陰影之間切換。
在代碼中使用 Windows Api 的優點是它們可以節省開發時間,因為它們包含大量有用的功能,已編寫并等待使用。 缺點是 Windows Api 可能很難處理和鐵面無私時出現問題。
Windows Api 表示一類特殊的互操作性。 Windows Api 不使用托管的代碼,沒有內置類型庫,并使用不同于與用于 Visual Studio 的數據類型。 鑒于這些區別,因為 Windows Api 不是 COM 對象,與 Windows Api互操作性 和 .NET Framework使用平臺執行的調用,簡稱 PInvoke。 平臺調用是一項服務,它使托管代碼能夠調用非托管的 Dll 中實現的函數。 有關詳細信息,請參閱使用非托管 DLL 函數。 可以通過使用 Visual Basic 中使用 PInvokeDeclare語句或將應用DllImport屬性為空的過程。
調用 Windows Api 的最常見方法是使用Declare語句。
若要聲明 DLL 過程
確定你想要調用,該函數及其參數、 參數類型的名稱和返回值,以及名稱和包含該 DLL 的位置。
有關 Windows Api 的完整信息,請參閱平臺 SDK Windows API 中的 Win32 SDK 文檔。 有關 Windows Api 使用的常量的詳細信息,檢查如 Windows.h Platform SDK 中包含的標頭文件。
通過單擊打開一個新的 Windows 應用程序項目新建上文件菜單中,然后單擊項目。 此時將出現“新建項目”對話框。
選擇Windows 應用程序從 Visual Basic 項目模板的列表。 顯示新的項目。
以下代碼添加到Declare函數到類或想要使用該 DLL 的模塊:
Declare語句包括以下元素。
Auto 修飾符
Auto修飾符指示運行時轉換基于根據公共語言運行時規則 (或已指定的別名) 的方法名稱的字符串。
Lib 和別名關鍵字
名稱以下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_ICONEXCLAMATION0x00000030 和是/無樣式MB_YESNO0x00000004,可以添加數字并獲取結果 0x00000034 52 十進制。 雖然可以直接使用十進制的結果,則最好將這些值聲明為你的應用程序中的常量并將其組合使用Or運算符。
若要聲明常量 Windows API 調用
要調用的 Windows 函數,請參閱文檔。 確定使用的常數的名稱以及包含這些常量的數值的.h 文件的名稱。
使用文本編輯器,如記事本,若要查看的內容標頭 (.h) 文件,并查找與正在使用的常量相關聯的值。 例如, MessageBox API 使用常量MB_ICONQUESTION在消息框中顯示一個問號。 有關定義MB_ICONQUESTION是在 WinUser.h 中,將出現,如下所示:
#define MB_ICONQUESTION 0x00000020L
添加等效Const到類或模塊,以使這些常量可用于應用程序的語句。 例如:
VB
復制
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您添加的按鈕,調用該過程,并提供適當的參數的事件處理程序:
VB
復制
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
End Sub
通過按 F5 運行項目。 消息框顯示兩個是并否響應按鈕。 單擊其中任何一個。
數據封送處理
Visual Basic 會自動將轉換的數據類型的參數和返回值為 Windows API 調用,但你可以使用MarshalAs屬性來顯式指定 API 預期的非托管的數據類型。 關于互操作封送處理的詳細信息,請參閱互操作封送處理。
若要在 API 調用中使用 Declare 和 MarshalAs
確定你想要的參數、 調用數據類型的函數的名稱和返回值。
若要簡化對訪問MarshalAs特性,請添加Imports到類或模塊,如以下示例所示的代碼的頂部的語句:
VB
復制
Imports System.Runtime.InteropServices
將導入的函數的函數原型添加到類或模塊使用的,并應用MarshalAs屬性為參數或返回值。 在下面的示例中,需要類型的 API 調用void*被封送為AsAny:
使用 DllImport 的 API 調用
DllImport屬性提供不帶類型庫在 Dll 中調用函數的第二個方法。 DllImport 大致相當于使用Declare語句,但可以更好地控制函數的調用方式。
可以使用DllImport與大多數 Windows API 調用,只要該調用是指在不共享 (有時稱為靜態) 方法。 不能使用需要的類實例的方法。 與不同Declare語句,DllImport的調用不能使用MarshalAs屬性。
若要調用 Windows API 使用 DllImport 特性
通過單擊打開一個新的 Windows 應用程序項目新建上文件菜單中,然后單擊項目。 此時將出現“新建項目”對話框。
選擇Windows 應用程序從 Visual Basic 項目模板的列表。 顯示新的項目。
添加名為的按鈕Button2到啟動窗體。
雙擊Button2以打開窗體的代碼視圖。
若要簡化對訪問DllImport,添加Imports語句啟動窗體類的代碼的頂部:
聲明一個空的函數,前面End Class窗體,并將函數命名為語句MoveFile。
將應用Public并Shared函數聲明和設置的參數的修飾符MoveFile根據 Windows API 函數使用的參數:
VB
你的函數名稱可以是任意有效的過程;DllImport屬性在 DLL 中指定的名稱。 它還處理互操作封送處理參數和返回值,因此,可以選擇 Visual Studio 的數據類型類似于數據的類型 API 使用。
將應用DllImport屬性為空函數。 第一個參數是名稱和包含要調用的函數的 dll 的位置。 不需要指定位于 Windows 系統目錄中文件的路徑。 第二個參數是函數的命名的參數,Windows API 中指定的名稱。 在此示例中,DllImport屬性強制調用MoveFile轉發到MoveFileWKERNEL32 中。DLL。 MoveFileW方法將文件復制從路徑src到路徑dst。
VB
將代碼添加到Button2_Click事件處理程序調用該函數:
VB
創建一個名為 Test.txt 文件并將其放在硬盤上 C:\Tmp 目錄中。 如有必要,請創建臨時目錄。
按 F5 鍵啟動該應用程序。 主窗體顯示。
單擊Button2。 如果可以移動該文件,則會顯示"文件已移動已成功"消息。
總結
以上是生活随笔為你收集整理的.net随笔-vb.net打开外部程序发送键盘信号(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java下载文件的几种方式
- 下一篇: 手机在线测试黄疸软件,在家怎么用手机测黄