Example #1
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))
                    {
                        Win32Api.KeyboardHookStruct KeyDataFromHook = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct));
                        Keys keyData = (Keys)KeyDataFromHook.vkCode;
                        //按下控制键
                        if ((OnKeyDownEvent != null || OnKeyPressEvent != null) && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN))
                        {
                            if (IsCtrlAltShiftKeys(keyData) && preKeysList.IndexOf(keyData) == -1)
                            {
                                preKeysList.Add(keyData);
                            }
                        }
                        //WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件
                        if (OnKeyDownEvent != null && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN))
                        {
                            KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));

                            OnKeyDownEvent(this, e);
                        }
                        //WM_KEYDOWN消息将引发OnKeyPressEvent
                        if (OnKeyPressEvent != null && wParam == Win32Api.WM_KEYDOWN)
                        {
                            byte[] keyState = new byte[256];
                            Win32Api.GetKeyboardState(keyState);

                            byte[] inBuffer = new byte[2];
                            if (Win32Api.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 == Win32Api.WM_KEYUP || wParam == Win32Api.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 == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP))
                        {
                            KeyEventArgs e = new KeyEventArgs(GetDownKeys(keyData));
                            OnKeyUpEvent(this, e);
                        }
                    }
                    return(Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam));
                }
Example #2
0
        /// <summary>
        /// 获取键盘消息
        /// </summary>
        /// <param name="nCode"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            // 如果该消息被丢弃(nCode<0
            if (nCode >= 0)
            {
                Win32Api.KeyboardHookStruct KeyDataFromHook = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct));

                int keyData = KeyDataFromHook.vkCode;

                //WM_KEYDOWN和WM_SYSKEYDOWN消息,将会引发OnKeyDownEvent事件
                if (OnKeyDownEvent != null && (wParam == Win32Api.WM_KEYDOWN || wParam == Win32Api.WM_SYSKEYDOWN))
                {
                    // 此处触发键盘按下事件
                    // keyData为按下键盘的值,对应 虚拟码
                    OnKeyDownEvent(this, new KeyDownEvent()
                    {
                        KeyData = keyData
                    });
                }

                //WM_KEYUP和WM_SYSKEYUP消息,将引发OnKeyUpEvent事件

                if (OnKeyUpEvent != null && (wParam == Win32Api.WM_KEYUP || wParam == Win32Api.WM_SYSKEYUP))
                {
                    // 此处触发键盘抬起事件
                    OnKeyUpEvent(this, new OnKeyUpEvent()
                    {
                        KeyData = keyData
                    });
                }
                if (KeyDataFromHook.vkCode == 91)//截获左边WIN键
                {
                    return(1);
                }
                if (KeyDataFromHook.vkCode == 92)//截获右边WIN键
                {
                    return(1);
                }
                if (KeyDataFromHook.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control)//截获Ctrl+ESC键
                {
                    return(1);
                }
                if (KeyDataFromHook.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt)//截获ALT+F4
                {
                    return(1);
                }
                if (KeyDataFromHook.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt)//截获ALT+TAB
                {
                    return(1);
                }
            }

            return(Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam));
        }
Example #3
0
 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
 {
     Win32Api.KeyboardHookStruct msg = (Win32Api.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.KeyboardHookStruct));
     if (nCode >= 0)
     {
         if (Win32Api.WM_KEYDOWN == wParam)
         {
             if (65 == msg.vkCode)
             {
                 return(1);
             }
         }
         else
         {
             return(0);
         }
     }
     return(CallNextHookEx(hKeyboardHook, nCode, wParam, lParam));
 }