• 如何攔截鍵盤輸入

這是使用Keyboard Hook 的範例,它的解釋請查VB 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
 
  • 相關資訊

  SetWindowsHookEx

  CallNextHookEx

  UnhookWindowsHookEx

  Q180936 - HOWTO- Position a MsgBox Using a Windows Hook Procedure

  Q177992 - HOWTO- Intercept Keyboard Input from Visual Basic

  Q226359 - HOWTO- Disable Task Switching on Win32 Platforms

  • 文件出處

  cww

VB心得筆記歡迎各位的指教,如果您有任何文章或資料願意提供給我們的,請來信到VBNote

如果對本站有任何建議,歡迎來信給Honey,我們會盡快給您答覆