七. 处理键盘事件
| LRESULT CALLBACK LowLevelKeyboardProc( int nCode,WPARAM wParam,LPARAM lParam); |
| private delegate IntPtr HookHandlerDelegate(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam); |
| private const int WM_KEYDOWN = 0x0100; private const int WM_SYSKEYDOWN = 0x0104; private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam) { //仅为KeyDown事件过滤wParam,否则该代码将再次执行-对于每一次击键(也就是,相应于KeyDown和KeyUp) //WM_SYSKEYDOWN是捕获Alt相关组合键所必需的 if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN)) { //激发事件 OnKeyIntercepted(new KeyboardHookEventArgs(lParam.vkCode, AllowKey)); //返回一个"哑"值以捕获击键 return (System.IntPtr)1; } //事件没有被处理,把它传递给下一个应用程序 return CallNextHookEx(hookID, nCode, wParam, ref lParam); } |
| private struct KBDLLHOOKSTRUCT { public int vkCode; int scanCode; public int flags; int time; int dwExtraInfo; } |
| private delegate IntPtr HookHandlerDelegate( int nCode, IntPtr wParam, IntPtr lParam); |
在这种情况中,lParam将仅返回vkCode。