Windows的鉤子函數(shù)分兩種,一種是全局的,一種是線程的。全局的鉤子函數(shù)可以捕獲任何應(yīng)用程序的消息,但必須是標(biāo)準(zhǔn)的DLL才能實現(xiàn),VB做不了。VB可以實現(xiàn)線程的,就是當(dāng)前應(yīng)用程序的消息,這對鼠標(biāo)消息的捕捉有影響。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),敖漢企業(yè)網(wǎng)站建設(shè),敖漢品牌網(wǎng)站建設(shè),網(wǎng)站定制,敖漢網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,敖漢網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
SetWindowsHookEx定義如下:
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
idHook是鉤子類型,如WH_KEYBOARD捕捉鍵盤消息,而WH_MOUSE捕捉鼠標(biāo)消息。hmod用于全局鉤子,VB要實現(xiàn)鉤子,必須設(shè)為0。dwThreadId用于線程鉤子VB中可以設(shè)置為App.ThreadID。lpfn為鉤子函數(shù),在VB中可以使用AddressOf獲得鉤子函數(shù)的地址。這個函數(shù)因為鉤子類型不同而有所不同。如鍵盤鉤子為:
Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
如果Code不為0,鉤子函數(shù)必須調(diào)用CallNextHookEx,將消息傳遞給下面的鉤子。wParam和lParam不是按鍵。
可以到這里看看:
.net的代碼真木有寫過。
VB 可以屏蔽 包括ctrl+alt+del在內(nèi)的所有鍵盤按鍵消息
其實你只要后臺截獲按鍵的消息后,直接屏蔽掉就可以了。
VB代碼我有 net木有。
VB對于win32 API的支持還是不錯的。而且比起用C++來說還簡化了不少。建議你看些windows系統(tǒng)機(jī)制的資料,比如windows消息處理機(jī)制,windows窗口過程的實現(xiàn)等。最好是去看看MFC的教程,會讓你對win32 API有更深入的了解。推薦孫鑫的《VC++深入詳解》,給其他窗體發(fā)送消息,鉤子什么的都有詳細(xì)的解釋。
關(guān)于做鉤子,使用SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx,CopyMemory四個win32 API函數(shù),再加上一個自己寫的回調(diào)函數(shù)就可以實現(xiàn)。
控制別的窗體最小化,給其他窗體發(fā)送消息,首先用FindWindow函數(shù)找到目標(biāo)窗體的句柄(對于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 '定義一個長整型變量儲存句柄
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
這是微軟MSDN官方文檔,里面詳細(xì)介紹了Hook機(jī)制,別告訴我你看不懂英文哦
(VS.85).aspx
我當(dāng)初自己研究Hook技術(shù)時就是看的這個
幾個重要的函數(shù):
// 安裝鉤子
HHOOK SetWindowsHookEx(int idHook, // 鉤子類型
HOOKPROC lpfn, // 回調(diào)函數(shù)
HINSTANCE hMod, // 實例句柄
DWORD dwThreadId // 線程ID
); // 返回值:鉤子句柄
// 將消息傳遞給下一個鉤子
LRESULT CallNextHookEx(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam); // 太累了不想翻譯了
// 卸載鉤子
BOOL UnhookWindowsHookEx(HHOOK hhk);
// 鑒于你給的懸賞分太低,我就不多寫了,自己研究MSDN文檔吧,祝你好運(yùn)
// 順便再說一句,全局鉤子要在DLL中實現(xiàn)
/* 剛才看了你的資料,覺得你這人挺有意思,貌似VB.NET玩得不錯,哈哈 */