VB對(duì)于win32 API的支持還是不錯(cuò)的。而且比起用C++來說還簡(jiǎn)化了不少。建議你看些windows系統(tǒng)機(jī)制的資料,比如windows消息處理機(jī)制,windows窗口過程的實(shí)現(xiàn)等。最好是去看看MFC的教程,會(huì)讓你對(duì)win32 API有更深入的了解。推薦孫鑫的《VC++深入詳解》,給其他窗體發(fā)送消息,鉤子什么的都有詳細(xì)的解釋。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供銅梁企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都做網(wǎng)站、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為銅梁眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
關(guān)于做鉤子,使用SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx,CopyMemory四個(gè)win32 API函數(shù),再加上一個(gè)自己寫的回調(diào)函數(shù)就可以實(shí)現(xiàn)。
控制別的窗體最小化,給其他窗體發(fā)送消息,首先用FindWindow函數(shù)找到目標(biāo)窗體的句柄(對(duì)于VB自己的窗體來說Me.hwnd屬性),然后用SendMessage,PostMessage函數(shù)發(fā)送消息。還可以用SetWindowText但是windows消息有幾百種,各種消息的參數(shù)可能是不同的。要查MSDN搞懂你要使用的消息的參數(shù)結(jié)構(gòu)。
代碼:關(guān)閉其他窗口:
模塊中的聲明:
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_CLOSE = H10 '定義消息常量
窗體中:
Dim hnd As Long '定義一個(gè)長(zhǎng)整型變量?jī)?chǔ)存句柄
Private Sub Form_Load()
hnd = FindWindow(vbNullString, "test") '獲取目標(biāo)窗體句柄,這里目標(biāo)窗體的標(biāo)題為"test"
SendMessage hnd, WM_CLOSE, 0, 0 '發(fā)送WM_CLOSE消息關(guān)閉窗體
End Sub
API(Advanced Programmers Interface,高級(jí)程序員接口)(注:API實(shí)際是指Application Programming Interface,應(yīng)用程序編程接口;此處疑為原文錯(cuò)誤,不過在VB中也可以這么說吧!)是一套用來控制Windows的各個(gè)部件(從桌面的外觀到位一個(gè)新進(jìn)程分配的內(nèi)存)的外觀和行為的一套預(yù)先定義的Windows函數(shù).用戶的每個(gè)動(dòng)作都會(huì)引發(fā)一個(gè)或幾個(gè)函數(shù)的運(yùn)行以Windows告訴發(fā)生了什么.
這在某種程度上很象Windows的天然代碼.其他的語言只是提供一種能自動(dòng)而且更容易的訪問API的方法.VB在這方面作了很多工作.它完全隱藏了API并且提供了在Windows環(huán)境下編程的一種完全不同的方法.
這也就是說,你用VB寫出的每行代碼都會(huì)被VB轉(zhuǎn)換為API函數(shù)傳遞給Windows.例如,Form1.Print...VB 將會(huì)以一定的參數(shù)(你的代碼中提供的,或是默認(rèn)參數(shù))調(diào)用TextOut 這個(gè)API函數(shù).
同樣,當(dāng)你點(diǎn)擊窗體上的一個(gè)按鈕時(shí),Windows會(huì)發(fā)送一個(gè)消息給窗體(這對(duì)于你來說是隱藏的),VB獲取這個(gè)調(diào)用并經(jīng)過分析后生成一個(gè)特定事件(Button_Click).
API函數(shù)包含在Windows系統(tǒng)目錄下的動(dòng)態(tài)連接庫(kù)文件中(如User32.dll,GDI32.dll,Shell32.dll...).
API 聲明
正如在"什么是API"中所說,API函數(shù)包含在位于系統(tǒng)目錄下的DLL文件中.你可以自己輸入API函數(shù)的聲明,但VB提供了一種更簡(jiǎn)單的方法,即使用API Text Viewer.
要想在你的工程中聲明API函數(shù),只需運(yùn)行API Text Viewer,打開Win32api.txt(或.MDB如果你已經(jīng)把它轉(zhuǎn)換成了數(shù)據(jù)庫(kù)的話,這樣可以加快速度.注:微軟的這個(gè)文件有很多的不足,你可以試一下本站提供下載的api32.txt),選擇"聲明",找到所需函數(shù),點(diǎn)擊"添加(Add)"并"復(fù)制(Copy)",然后粘貼(Paste)到你的工程里.使用預(yù)定義的常量和類型也是同樣的方法.
你將會(huì)遇到一些問題:
假設(shè)你想在你的窗體模塊中聲明一個(gè)函數(shù).粘貼然后運(yùn)行,VB會(huì)告訴你:編譯錯(cuò)誤...Declare 語句不允許作為類或?qū)ο竽K中的 Public 成員...看起來很糟糕,其實(shí)你需要做的只是在聲明前面添加一個(gè)Private(如 Private Declare Function...).--不要忘了,可是這將使該函數(shù)只在該窗體模塊可用.
在有些情況下,你會(huì)得到"不明確的名稱"這樣的提示,這是因?yàn)楹瘮?shù).常量或其他的什么東西共用了一個(gè)名稱.由于絕大多數(shù)的函數(shù)(也可能是全部,我沒有驗(yàn)證過)都進(jìn)行了別名化,亦即意味著你可以通過Alias子句使用其它的而不是他們?cè)械拿Q,你只需簡(jiǎn)單地改變一下函數(shù)名稱而它仍然可以正常運(yùn)行.
你可以通過查看VB的Declare語句幫助主題來獲取有關(guān)Alias的詳細(xì)說明.
沒有Api瀏覽器,因?yàn)閂B.NET不推薦使用API,因此Microsoft推薦您使用.NET里面的類和方法(而不是API函數(shù))來實(shí)現(xiàn)您的需求。
你可以自己制作一個(gè)瀏覽器:
把VB6.0安裝目錄下的Common\Tools\Winapi下的文件拷貝到任一目錄,再把VB6.0所在操作系統(tǒng)下的System32\DBGrid.ocx拷貝到VB.NET所在操作系統(tǒng)下的System32目錄下,再直接運(yùn)行你剛才拷貝過來的APILOAD.exe就可以了。
(1).使用DllImport特征類來申明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”語句來申明Windows API函數(shù):
使用“Declare”語句的確比使用DllImport特征類要簡(jiǎn)單了許多,下面是在Visual Basic .Net中使用“Declare”語句來聲明上述二個(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中聲明Windows API函數(shù)時(shí),“Declare”語句中Alias關(guān)鍵字的作用相當(dāng)于使用DllImport特征類中的EntryPoint對(duì)象字段。同樣在使用“Declare”語句聲明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