2007-10-25 23:57:04 Kenny

如何攔截鍵盤輸入

來源:cww

這是使用Keyboard Hook 的範例,它的解釋請查VB5 Call WinAPI技巧Hook的簡介
'以下在.Bas
Option Explicit

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
Declare Function UnhookWindowsHookEx Lib "user32" _
    (ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
   ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

Public hnexthookproc As Long
Public Const HC_ACTION = 0
Public Const WH_KEYBOARD = 2

Public Sub UnHookKBD()
If hnexthookproc <> 0 Then
   UnhookWindowsHookEx hnexthookproc
   hnexthookproc = 0
End If
End Sub
Public Function EnableKBDHook()
If hnexthookproc <> 0 Then
   Exit Function
End If
hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
            MyKBHFunc, App.hInstance, 0)
If hnexthookproc <> 0 Then
   EnableKBDHook = hnexthookproc
End If
End Function
Public Function MyKBHFunc(ByVal iCode As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
  '這三個參數是固定的,不能動,而MyKBHFunc這個名稱只要和
  'SetWindowsHookex()中 AddressOf後的名稱一樣便可,不一定叫什麼
  'wParam 是傳入按了哪個key的virtual-key code

  '如果您將以下的兩行unmark則所有鍵盤的輸入皆沒有作用
  'MyKBHFunc = 1  '吃掉訊息
  'Exit Function

  MyKBHFunc = 0 '訊息要處理
  If iCode < 0 Then
    MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
    Exit Function
  End If
  If wParam = vbKeySnapshot Then  '偵測 有沒有按到PrintScreen鍵
    MyKBHFunc = 1 '在這個Hook便吃掉這個訊息
    Debug.Print "haha"
  Else
    Call CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
  End If
End Function

'以下在Form
Private Sub Form_Load()
Call EnableKBDHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call UnHookKBD
End Sub