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