日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

VB无所不能之三:VB截获Windows消息的钩子

發(fā)布時(shí)間:2025/7/14 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VB无所不能之三:VB截获Windows消息的钩子 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

本文地址:http://blog.csdn.net/useway?《Java程序員,上班那點(diǎn)事兒》

——作者:鐘聲 VB一直被認(rèn)為是一個(gè)可以通過簡單的方法,完成Windows界面應(yīng)用程序的一個(gè)語言。對Windows系統(tǒng)方面的編程似乎首先想到的絕對不是VB,而大部分程序員想到的一定是VC。我們今天就介紹一種用VB截獲Windows全局消息的方法。 ??? 一、Windows全局消息介紹 我不喜歡用非常晦澀的語言來介紹一個(gè)簡單的事物,因此,我想在本篇文章中就用通俗的語言來解釋這個(gè)概念吧。 什么是Windows全局消息呢? 例如:鼠標(biāo)在自定義的窗口中移動(dòng)的位置,我們可以通過這個(gè)Form中的相關(guān)方法獲取,然而,如果鼠標(biāo)并沒有在自己的Form中移動(dòng)又該怎么獲得其位置呢? 再例如:鍵盤的敲擊動(dòng)作,在別的地方敲擊鍵盤,并沒有在自己的Form中敲擊鍵盤,怎么才能獲得按鍵的具體鍵值呢? 對單片機(jī)有了解的朋友都知道,鼠標(biāo)和鍵盤的操作都是利用的是“中斷”觸發(fā)事件來完成的,那么當(dāng)系統(tǒng)“中斷”的時(shí)候,就會(huì)發(fā)出消息給操作系統(tǒng),而這些消息就是Windows全局消息。 ??? 二、鉤子簡介 鉤子是通過英文Hook翻譯過來的,所謂的鉤子就是在Windows全局消息傳遞到操作系統(tǒng)之前進(jìn)行截獲,經(jīng)過處理后再傳遞給操作系統(tǒng)或者其他鉤子的程序。 想想看,鉤子聽起來像什么程序? 對沒錯(cuò),黑客程序,木馬程序,都是通過鉤子的方法獲取鼠標(biāo)鍵盤的相應(yīng)操作信息,還獲取密碼或其他有用信息的。 但是,鉤子其本身并不是病毒,而是提供給我們程序員一種獲取操作系統(tǒng)動(dòng)作的一個(gè)方法,這個(gè)方法有時(shí)候非常有用,可以非常方便的開發(fā)針對操作系統(tǒng)的優(yōu)質(zhì)程序。 ??? 三、消息種類 1、WH_CALLWNDPROC和WH_CALLWNDPROCRET 這兩種消息是發(fā)送到窗口過程的消息,系統(tǒng)在消息發(fā)送到接收窗口過程之前調(diào)用WH_CALLWNDPROC,并且在窗口過程處理完消息之后調(diào)用WH_CALLWNDPRO 。 2、WH_CBT??? 它是激活,建立,銷毀,最小化,最大化,移動(dòng),改變尺寸等窗口事件; 完成系統(tǒng)指令;來自系統(tǒng)消息隊(duì)列中的移動(dòng)鼠標(biāo),鍵盤事件; 設(shè)置輸入焦點(diǎn)事件;同步系統(tǒng)消息隊(duì)列事件。 3、WH_KEYBOARD WM_KEYDOWN???? 監(jiān)視???? WM_KEYUP 4、WH_KEYBOARD_LL 監(jiān)視輸入到線程消息隊(duì)列中的鍵盤消息 5、WH_MOUSE 監(jiān)視輸入到消息隊(duì)列中的鼠標(biāo)消息 6、WH_MOUSE_LL 監(jiān)視輸入到線程消息隊(duì)列中的鼠標(biāo)消息
????四、鉤子類型 1)??? 線程鉤子:監(jiān)視指定線程的事件消息。????
??? 2)??? 系統(tǒng)鉤子:監(jiān)視系統(tǒng)中的所有線程的事件消息。 VB只能設(shè)定線程鉤子,因?yàn)橄到y(tǒng)鉤子會(huì)影響系統(tǒng)中所有的應(yīng)用程序,所以鉤子函數(shù)必須放在獨(dú)立的動(dòng)態(tài)鏈接庫(DLL)中才能做到。 ?? 五、VB建立鉤子的方法步驟 ???步驟1:掛鉤 掛鉤是第一步,目的是1,告訴操作系統(tǒng)我要監(jiān)聽什么消息,2是告訴操作系統(tǒng)得到消息后調(diào)用什么回調(diào)函數(shù)。 掛鉤的方法: 例如: Private Const WH_MOUSE_LL As Long = 14 Private hHook As Long ...... hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0) 第一個(gè)參數(shù):告訴操作系統(tǒng),我要掛的是一個(gè)鼠標(biāo)監(jiān)聽鉤子。 第二個(gè)參數(shù):告訴操作系統(tǒng),我的回調(diào)函數(shù)是HookProc,AddressOf的作用是得到HookProc這個(gè)函數(shù)的地址。 ???步驟二:回調(diào)函數(shù)的編寫 Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
??? Dim typMHS As MSLLHOOKSTRUCT, pt As POINTAPI If wParam = WM_MOUSEMOVE Then
??????? Call CopyMemory(typMHS, ByVal lparam, LenB(typMHS))
??????? pt = typMHS.pt
??????? 'If PtInRect(hRT, pt.x, pt.y) <> 0 Then
??????? '??? HookProc = 1 '取消原本要完成的動(dòng)作
??????? 'Else
??????????? Form1.Caption = "mouse Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
??????????? HookProc = 0 '令待完成的動(dòng)作繼續(xù)完成
??????? 'End If
??? End If
???
??? If wParam = WM_LBUTTONDOWN Then
?????? Debug.Print "l"
??? End If
???
??? If wParam = WM_RBUTTONDOWN Then
?????? Debug.Print "r"
??? End If
???
??? 'If nCode < 0 Then
?????? HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
??? '?? Exit Function
??? 'End If
???
End Function
注意一:回調(diào)函數(shù)的格式 Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
nCode:鉤子的句柄
???? wParam,lParam:包含了攔截到的消息內(nèi)容,同樣它也與Hook的種類和nCode的值不同而不同。比如在鍵盤鉤子(KeyBoard)中,wParam則是按鍵返回碼。如果是鼠標(biāo)事件,那么包含的鼠標(biāo)的位置信息和按鍵信息。 注意二:在回調(diào)函數(shù)結(jié)束的時(shí)候,需要增加一個(gè)CallNextHookEx把消息再傳遞給下一個(gè)鉤子或者操作系統(tǒng)。 這個(gè)也很好理解,你截獲消息以后,并不是要把這個(gè)消息真的截獲,而只是想進(jìn)行相應(yīng)處理,然后再把消息傳遞給下一個(gè)接棒者。 ??? 步驟三:釋放鉤子 在程序結(jié)束后,需要把鉤子摘掉,否則,一直會(huì)監(jiān)聽系統(tǒng)的消息。 Call UnhookWindowsHookEx(hHook) ??? 六、完整的VB鉤子程序 模塊代碼: Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private 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
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) As Long Private Const HC_ACTION = 0
Private Const WH_MOUSE_LL As Long = 14
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MOUSEACTIVATE = &H21
Private Const WM_MOUSEFIRST = &H200
Private Const WM_MOUSELAST = &H209
Private Const WM_MOUSEWHEEL = &H20A?? '以上是鼠標(biāo)的各個(gè)值 Private Type POINTAPI
?? x As Long
?? y As Long
End Type Private Type MSLLHOOKSTRUCT
??? pt As POINTAPI
??? mouseData As Long
??? Flags As Long
??? time As Long
??? dwExtraInfo As Long
End Type Public hHook As Long Public Sub EnableHook()
??? If hHook = 0 Then
?????? hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
??? End If
End Sub Public Sub FreeHook()
??? If hHook <> 0 Then
?????? Call UnhookWindowsHookEx(hHook)
?????? hHook = 0
??? End If
End Sub Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
??? Dim typMHS As MSLLHOOKSTRUCT, pt As POINTAPI If wParam = WM_MOUSEMOVE Then
??????? Call CopyMemory(typMHS, ByVal lparam, LenB(typMHS))
??????? pt = typMHS.pt
??????? Debug.Print "mouse Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
??? End If
???
??? If wParam = WM_LBUTTONDOWN Then
?????? Debug.Print "l"
??? End If
???
??? If wParam = WM_RBUTTONDOWN Then
?????? Debug.Print "r"
??? End If
???
??? HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
?
End Function
? 窗口代碼: Private Sub Form_Load()
??? EnableHook
End Sub Private Sub Form_Unload(Cancel As Integer)
??? FreeHook
End Sub

原文鏈接: http://blog.csdn.net/useway/article/details/4358169

轉(zhuǎn)載于:https://my.oschina.net/dtec/blog/44948

總結(jié)

以上是生活随笔為你收集整理的VB无所不能之三:VB截获Windows消息的钩子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。