示例#1
0
        public void SetHook()
        {
            KeyboardHookDelegate = new KeyHooker.HookProc(KeyboardHookProc);
            Process       cProcess = Process.GetCurrentProcess();
            ProcessModule cModule  = cProcess.MainModule;
            var           mh       = KeyHooker.GetModuleHandle(cModule.ModuleName);

            hHook = KeyHooker.SetWindowsHookEx(KeyHooker.WH_KEYBOARD_LL, KeyboardHookDelegate, mh, 0);
        }
示例#2
0
        private List <Keys> preKeysList = new List <Keys>();//存放被按下的控制键,用来生成具体的键
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            //如果该消息被丢弃(nCode<0)或者没有事件绑定处理程序则不会触发事件
            if ((nCode >= 0) && (OnKeyDownEvent != null || OnKeyUpEvent != null || OnKeyPressEvent != null))
            {
                KeyHooker.KeyboardHookStruct KeyDataFromHook = (KeyHooker.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyHooker.KeyboardHookStruct));
                Keys keyData = (Keys)KeyDataFromHook.vkCode;
                //按下控制键
                if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == KeyHooker.WM_KEYDOWN || wParam == KeyHooker.WM_SYSKEYDOWN))
                {
                    if (IsCtrlAltShiftKeys(keyData) && preKeysList.IndexOf(keyData) == -1)
                    {
                        preKeysList.Add(keyData);
                    }
                }
                //WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件
                if (OnKeyDownEvent != null && (wParam == KeyHooker.WM_KEYDOWN || wParam == KeyHooker.WM_SYSKEYDOWN))
                {
                    KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));

                    OnKeyDownEvent(this, e);
                }
                //WM_KEYDOWN消息将引发OnKeyPressEvent
                if (OnKeyPressEvent != null && wParam == KeyHooker.WM_KEYDOWN)
                {
                    byte[] keyState = new byte[256];
                    KeyHooker.GetKeyboardState(keyState);
                    byte[] inBuffer = new byte[2];
                    if (KeyHooker.ToAscii(KeyDataFromHook.vkCode, KeyDataFromHook.scanCode, keyState, inBuffer, KeyDataFromHook.flags) == 1)
                    {
                        KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
                        OnKeyPressEvent(this, e);
                    }
                }
                //松开控制键
                if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == KeyHooker.WM_KEYUP || wParam == KeyHooker.WM_SYSKEYUP))
                {
                    if (IsCtrlAltShiftKeys(keyData))
                    {
                        for (int i = preKeysList.Count - 1; i >= 0; i--)
                        {
                            if (preKeysList[i] == keyData)
                            {
                                preKeysList.RemoveAt(i);
                            }
                        }
                    }
                }
                //WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件
                if (OnKeyUpEvent != null && (wParam == KeyHooker.WM_KEYUP || wParam == KeyHooker.WM_SYSKEYUP))
                {
                    KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));
                    OnKeyUpEvent(this, e);
                }
            }
            return(KeyHooker.CallNextHookEx(hHook, nCode, wParam, lParam));
        }
示例#3
0
 public void UnHook()
 {
     KeyHooker.UnhookWindowsHookEx(hHook);
 }