msdn上说明:一些控件能够拦截键盘事件,以致窗体不能接收它们。这样的例子有:CommandButton 控件有焦点时的 ENTER 键、以及焦点在 ListBox 控件上时的方向键。 能不能不管焦点在那里?都能响应enter键
可以捕获到啊,我测试的代码是这样的,你看看 Option ExplicitPrivate Sub Form_KeyPress(KeyAscii As Integer) MsgBox "我按了enter" End SubPrivate Sub Form_Load() Form1.KeyPreview = True End Sub
那么就在每个按钮的 KeyPress 事件中 Form_KeyPress(Keyascii) 这样来触发 Form 的事件
怎么问了两次,算了,那就说两次吧。 'HookModule Option Explicit Public Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long Public strKeyName As String * 255 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 prelParam As Long Public prewParam As Long Public psd As New CollectionPublic Sub UnHookKBD() If hnexthookproc <> 0 Then UnhookWindowsHookEx hnexthookproc hnexthookproc = 0 End If End SubPublic Function EnableKBDHook() If hnexthookproc <> 0 Then Exit Function hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, 0) If hnexthookproc <> 0 Then EnableKBDHook = hnexthookproc ' Form1.List1.AddItem EnableKBDHook End If
End FunctionPublic Function MyKBHFunc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '这三个参数是固定的,不能动,而MyKBHFunc这个名称只要和 'SetWindowsHookex()中 AddressOf後的名称一样便可,不一定叫什麽 'wParam 是传入按了哪个key的virtual-key code '如果您将以下的两行un则所有键盘的输入皆没有作用 'MyKBHFunc = 1 '吃掉信息 MyKBHFunc = 0 '信息要处理 If iCode < 0 Then MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam) 'Form1.List1.AddItem "haha" & " " & wParam & " " & lParam Exit Function End If MyKBHFunc = 1 '在这个Hook便吃掉这个信息 If wParam = 13 Then msgbox "you input the enter" End If MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam) End Function
能不能不管焦点在那里?都能响应enter键
Option ExplicitPrivate Sub Form_KeyPress(KeyAscii As Integer)
MsgBox "我按了enter"
End SubPrivate Sub Form_Load()
Form1.KeyPreview = True
End Sub
我的意思是不管焦点在什么控件上,都能捕获:)
Form_KeyPress(Keyascii) 这样来触发 Form 的事件
'HookModule
Option Explicit
Public Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Public strKeyName As String * 255
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 prelParam As Long
Public prewParam As Long
Public psd As New CollectionPublic Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hnexthookproc
hnexthookproc = 0
End If
End SubPublic Function EnableKBDHook()
If hnexthookproc <> 0 Then Exit Function
hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf MyKBHFunc, App.hInstance, 0)
If hnexthookproc <> 0 Then
EnableKBDHook = hnexthookproc
' Form1.List1.AddItem EnableKBDHook
End If
End FunctionPublic Function MyKBHFunc(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '这三个参数是固定的,不能动,而MyKBHFunc这个名称只要和
'SetWindowsHookex()中 AddressOf後的名称一样便可,不一定叫什麽
'wParam 是传入按了哪个key的virtual-key code
'如果您将以下的两行un则所有键盘的输入皆没有作用
'MyKBHFunc = 1 '吃掉信息
MyKBHFunc = 0 '信息要处理
If iCode < 0 Then
MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
'Form1.List1.AddItem "haha" & " " & wParam & " " & lParam
Exit Function
End If
MyKBHFunc = 1 '在这个Hook便吃掉这个信息
If wParam = 13 Then
msgbox "you input the enter"
End If
MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
End Function
能不能结合我的问题给一个实际使用的例子啊!
谢谢了 :)