唉!我亲爱的键盘啊!
我亲爱的键盘啊!这么多年风风雨雨都过来了,为什么偏偏在这个时候不好用了呢?你哪个回车键,为什么一按下去就不弹起来了呢?我曾经试着用拳头砸过你,没有用;我又用锤头砸过你,结果回车键更弹不起来了!有心将你弃之东隅,但转念一想,我抚摸了这么长时间、对我这么有感情的东西,怎么能将它放弃呢?硬的不行,只好,来点软的吧!于是乎,我七拼八凑,写了点代码,将你搞定。
模块中:
Private hHook 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
Declare Function CallNextHookEx Lib "user32" _
(ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
'很多没用的,也加上了
Private Const WH_CALLWNDPROC = 4
Private Const WH_CALLWNDPROCRET = 12
Private Const WH_CBT = 5
Private Const WH_DEBUG = 9
Private Const WH_FOREGROUNDIDLE = 11
Private Const WH_GETMESSAGE = 3
Private Const WH_HARDWARE = 8
Private Const WH_JOURNALPLAYBACK = 1
Private Const WH_JOURNALRECORD = 0
Private Const WH_KEYBOARD = 2
Private Const WH_MOUSE = 7
Private Const WH_MSGFILTER = (-1)
Private Const WH_SHELL = 10
Private Const WH_SYSMSGFILTER = 6
Private Const WH_KEYBOARD_LL = 13
Private Const WH_MOUSE_LL = 14
Private Const HC_ACTION As Integer = 0
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_SYSKEYDOWN As Integer = &H104
Private Const WM_SYSKEYUP As Integer = &H105
Private Type EVENTMSG
wMsg As Long
lParamL As Long
lParamH As Long
msgTime As Long
hWndMsg As Long
End Type
Private EMSG As EVENTMSG
Dim lastTimer As Double
Public Sub UnHookKBD()
If hHook <> 0 Then
UnhookWindowsHookEx hHook
hHook = 0
End If
End Sub
Public Function EnableKBDHook()
If hHook <> 0 Then
Exit Function
End If
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf _
MyKBHFunc, App.hInstance, ByVal 0&)
End Function
Private Function MyKBHFunc(ByVal iCode As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If iCode <> HC_ACTION Then Exit Function
If wParam = WM_KEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Or wParam = WM_SYSKEYDOWN Then
CopyMemory EMSG, ByVal lParam, Len(EMSG)
If EMSG.wMsg = 13 Then '侦测 有没有按到Enter键
If Abs(lastTimer - Timer) <= 0.05 Then MyKBHFunc = 1 '在这个Hook便吃掉这个讯息
lastTimer = Timer
Exit Function
End If
End If
Call CallNextHookEx(hHook, iCode, wParam, lParam) '传给下一个Hook
End Function
窗口中:
Private Sub Form_Load()
EnableKBDHook
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHookKBD
End Sub
只要我在使用键盘前,打开这个小程序,就不会出现因长时间连续按回车键而无数次打开同一个程序而死机了!