VB無所不能之三:VB截獲Windows訊息的鉤子

來源:互聯網
上載者:User

本文地址:http://blog.csdn.net/useway 《Java程式員,上班那點事兒》

——作者:鐘聲     VB一直被認為是一個可以通過簡單的方法,完成Windows介面應用程式的一個語言。對Windows系統方面的編程似乎首先想到的絕對不是VB,而大部分程式員想到的一定是VC。我們今天就介紹一種用VB截獲Windows全域訊息的方法。        一、Windows全域訊息介紹    我不喜歡用非常晦澀的語言來介紹一個簡單的事物,因此,我想在本篇文章中就用通俗的語言來解釋這個概念吧。    什麼是Windows全域訊息呢?    例如:滑鼠在自訂的視窗中移動的位置,我們可以通過這個Form中的相關方法擷取,然而,如果滑鼠並沒有在自己的Form中移動又該怎麼獲得其位置呢?    再例如:鍵盤的敲擊動作,在別的地方敲擊鍵盤,並沒有在自己的Form中敲擊鍵盤,怎麼才能獲得按鍵的具體索引值呢?    對單片機有瞭解的朋友都知道,滑鼠和鍵盤的操作都是利用的是“中斷”觸發事件來完成的,那麼當系統“中斷”的時候,就會發出訊息給作業系統,而這些訊息就是Windows全域訊息。      二、鉤子簡介    鉤子是通過英文Hook翻譯過來的,所謂的鉤子就是在Windows全域訊息傳遞到作業系統之前進行截獲,經過處理後再傳遞給作業系統或者其他鉤子的程式。    想想看,鉤子聽起來像什麼程式?    對沒錯,駭客程式,木馬程式,都是通過鉤子的方法擷取滑鼠鍵盤的相應操作資訊,還擷取密碼或其他有用資訊的。    但是,鉤子其本身並不是病毒,而是提供給我們程式員一種擷取作業系統動作的一個方法,這個方法有時候非常有用,可以非常方便的開發針對作業系統的優質程式。      三、訊息種類     1、WH_CALLWNDPROC和WH_CALLWNDPROCRET    這兩種訊息是發送到視窗過程的訊息,系統在訊息發送到接收視窗過程之前調用WH_CALLWNDPROC,並且在視窗過程處理完訊息之後調用WH_CALLWNDPRO 。     2、WH_CBT        它是啟用,建立,銷毀,最小化,最大化,移動,改變尺寸等視窗事件;    完成系統指令;來自系統訊息佇列中的移動滑鼠,鍵盤事件;    設定輸入焦時間點事件;同步系統訊息佇列事件。     3、WH_KEYBOARD    WM_KEYDOWN     監視     WM_KEYUP     4、WH_KEYBOARD_LL     監視輸入到線程訊息佇列中的鍵盤訊息     5、WH_MOUSE    監視輸入到訊息佇列中的滑鼠訊息     6、WH_MOUSE_LL    監視輸入到線程訊息佇列中的滑鼠訊息     四、鉤子類型        1)    線程鉤子:監視指定線程的事件訊息。    
    2)    系統鉤子:監視系統中的所有線程的事件訊息。     VB只能設定線程鉤子,因為系統鉤子會影響系統中所有的應用程式,所以鉤子函數必須放在獨立的動態連結程式庫(DLL)中才能做到。     五、VB建立鉤子的方法步驟     步驟1:掛鈎    掛鈎是第一步,目的是1,告訴作業系統我要監聽什麼訊息,2是告訴作業系統得到訊息後調用什麼回呼函數。    掛鈎的方法:   例如:   Private Const WH_MOUSE_LL As Long = 14   Private hHook As Long   ......   hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)    第一個參數:告訴作業系統,我要掛的是一個滑鼠監聽鉤子。   第二個參數:告訴作業系統,我的回呼函數是HookProc,AddressOf的作用是得到HookProc這個函數的地址。     步驟二:回呼函數的編寫    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 '取消原本要完成的動作
        'Else
            Form1.Caption = "mouse Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
            HookProc = 0 '令待完成的動作繼續完成
        '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     注意一:回呼函數的格式    Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long     nCode:鉤子的控制代碼
     wParam,lParam:包含了攔截到的訊息內容,同樣它也與Hook的種類和nCode的值不同而不同。比如在鍵盤鉤子(KeyBoard)中,wParam則是按鍵返回碼。如果是滑鼠事件,那麼包含的滑鼠的位置資訊和按鍵資訊。     注意二:在回呼函數結束的時候,需要增加一個CallNextHookEx把訊息再傳遞給下一個鉤子或者作業系統。    這個也很好理解,你截獲訊息以後,並不是要把這個訊息真的截獲,而只是想進行相應處理,然後再把訊息傳遞給下一個接棒者。      步驟三:釋放鉤子    在程式結束後,需要把鉤子摘掉,否則,一直會監聽系統的訊息。     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 LongPrivate 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   '以上是滑鼠的各個值Private Type POINTAPI
   x As Long
   y As Long
End TypePrivate Type MSLLHOOKSTRUCT
    pt As POINTAPI
    mouseData As Long
    Flags As Long
    time As Long
    dwExtraInfo As Long
End TypePublic hHook As LongPublic Sub EnableHook()
    If hHook = 0 Then
       hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
    End If
End SubPublic Sub FreeHook()
    If hHook <> 0 Then
       Call UnhookWindowsHookEx(hHook)
       hHook = 0
    End If
End SubPublic 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 SubPrivate Sub Form_Unload(Cancel As Integer)
    FreeHook
End Sub
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.