【全局键盘钩子】的事件处理问题,各位老鸟给个方案
清晨曦月 元老
博客专家认证 2008-05-28 11:12:24 情况如下:
用.NET 2008写的全局键盘钩子,分别处理Key_Down和Key_Up——分别引发Key_Down和Key_Up事件,但当吃掉按键消息时,遇到了如下问题:
在Key_Down的代码中,吃掉了某个按键,但由于该代码运行时间较长,没有运行完呢,Key_Up事件就被激活了,结果导致只吃掉了KeyDown而KeyUp被投递到了其他窗口,这是非常令人头疼的,希望用钩子的老鸟给出一个解决方案,但不要告诉我Key_Down事件未完成时让Key_Up永远等待,这种方式会导致效率问题,而且可能导致下一个按键无法被正确处理。
回调部分代码如下:
Private Function KeyBoardProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
If _KyesCallNext Then
Dim newPtr As New KeyboardHookStruct
newPtr = CType(Marshal.PtrToStructure(lParam, newPtr.GetType), KeyboardHookStruct)
If nCode = HC_ACTION Then
Dim KeyData As Keys = newPtr.vkCode
Dim e As New System.Windows.Forms.KeyEventArgs(KeyData)
If wParam.ToInt32 = WM_KEYDOWN Or wParam.ToInt32 = WM_SYSKEYDOWN Then
If Not KeyCancel.Contains(e.KeyCode.ToString.ToLower) Then
RaiseEvent KeyDown(e,DownCancel) '111111111111111111
End If
if DownCancel then return 1
ElseIf wParam.ToInt32 = WM_KeyUP Or wParam.ToInt32 = WM_SYSKEYUP Then
RaiseEvent KeyUp(e,UpCancel) '222222222222222222
if UpCancel then return 1
End If
End If
End If
Return CallNextHookEx(m_iKeyHandle, nCode, wParam, lParam)
End Function
以上1处被处理时,2处代码会被激活。
分析时请注意:
1、问题仅限这一处,代码的其他功能绝对没有任何问题
2、不要认为用户会严格的每次只按下一个键,抬起,然后再去按其他键,再抬起:按键可能是组合的,含有ctrl,Shift,Alt,Win等等的,也可能是同时按下多个键铷ABC等,当然这种同时不是绝对的,只是我们写代码要考虑到按键交叉的情况。
要求代码效率一定要高,原因如上所述。
郁闷,在.NET区只能开100的帖子。视情况再加分吧