鍵盤輸入輔助類KeyboardHook

實現效果

  1. 本輔助類主要是用來方便實現全局鍵盤鉤子,用來捕捉系統全局的鍵盤輸入。
  2. 通過鍵盤鉤子,我們可以獲取用戶的各種按鍵信息,以及可以屏蔽指定按鍵的操作。

實現步驟

在代碼引用相關的代碼實現動態調用。

實現代碼

  1. 輔助類提供的方法接口如下所示:
/// 判斷是否CTRL鍵按下
public static bool Control = false;
/// 判斷Shift鍵是否按下
public static bool Shift = false;
/// 檢查Alt鍵是否按下
public static bool Alt = false;
/// 檢查Windows鍵是否按下
public static bool Win = false;
/// 鍵盤敲擊事件代理定義
public delegate bool KeyPressed();
/// 處理鍵盤按下委託函數
public delegate bool KeyboardHookHandler(Keys key);
/// 添加一個鍵盤鉤子處理給當前的鍵
public static KeyboardHookHandler KeyDown;
/// 啓動鍵盤鉤子處理
public static bool Enable()
/// 禁用鍵盤鉤子處理
public static bool Disable()
/// 添加一個按下鍵的鉤子處理
public static bool AddKeyDown(Keys key, KeyPressed callback)
/// 添加一個鍵彈起的鉤子處理
public static bool AddKeyUp(Keys key, KeyPressed callback)
/// 添加一個按下鍵的鉤子處理
public static bool Add(Keys key, KeyPressed callback)
/// 移除一個按下鍵的鉤子處理
public static bool RemoveDown(Keys key)
/// 移除一個彈起鍵的鉤子處理
public static bool RemoveUp(Keys key)
/// 移除一個鍵的鉤子處理
public static bool Remove(Keys key)
/// 返回一個給定的鍵基於當前的控制鍵的字符串表示形式。
public static string KeyToString(Keys key)
  1. 輔助類KeyboardHook的使用例子代碼如下所示
private void btnKeyboadHook_Click(object sender, EventArgs e)
{
KeyboardHook.Enable();
KeyboardHook.Add(Keys.S, new KeyboardHook.KeyPressed(TestKeyboadHook));
}
private bool TestKeyboadHook()
{
//僅處理Alt + S 的鉤子事件
if (KeyboardHook.Alt)
{
this.Text = DateTime.Now.ToString();
NativeMethods.BringToFront(this.Handle);
}
return true; //如果要被其他程序捕捉,返回True,否則返回False。
}
private void btnRemoveKeyboadHook_Click(object sender, EventArgs e)
{
KeyboardHook.Remove(Keys.S);
}

附上源碼

/// <summary>
///全局鍵盤鉤子,用來捕捉系統全局的鍵盤輸入。
/// </summary>
public static class KeyboardHook
{
        //鉤子句柄,用於安裝或者卸載鉤子之用
        private static IntPtr hHook = IntPtr.Zero;

        //鉤子過濾器處理
        private static Hooks.HookProc hookproc = new Hooks.HookProc(Filter);

        /// <summary>
        /// 判斷是否CTRL鍵按下
        /// </summary>
        public static bool Control = false;

        /// <summary>
        /// 判斷Shift鍵是否按下
        /// </summary>
        public static bool Shift = false;

        /// <summary>
        /// 檢查Alt鍵是否按下
        /// </summary>
        public static bool Alt = false;

        /// <summary>
        /// 檢查Windows鍵是否按下
        /// </summary>
        public static bool Win = false;

        /// <summary>
        /// 鍵盤敲擊事件代理定義
        /// </summary>
        public delegate bool KeyPressed();

        /// <summary>
        /// 鍵盤處理操作定義
        /// </summary>
        private static CDictionary<Keys, KeyPressed> handledKeysDown = new CDictionary<Keys, KeyPressed>();
        private static CDictionary<Keys, KeyPressed> handledKeysUp = new CDictionary<Keys, KeyPressed>();

        /// <summary>
        /// 處理鍵盤按下委託函數
        /// </summary>
        /// <param name="key">
        /// 按下的鍵。需檢查CTRL、Shift、Win等鍵。
        /// </param>
        /// <returns>
        /// 如果想應用程序能捕捉到,設置爲True;如果設置爲False,則鍵盤事件被屏蔽。
        /// </returns>
        public delegate bool KeyboardHookHandler(Keys key);

        /// <summary>
        /// 添加一個鍵盤鉤子處理給當前的鍵
        /// </summary>
        public static KeyboardHookHandler KeyDown;

        /// <summary>
        /// 繼續跟蹤鉤子狀態
        /// </summary>
        private static bool Enabled;

        /// <summary>
        /// 啓動鍵盤鉤子處理
        /// </summary>
        /// <returns>如無異常返回True</returns>
        public static bool Enable()
        {
            if (Enabled == false)
            {
                try
                {
                    using (Process curProcess = Process.GetCurrentProcess())
                    {
                        using (ProcessModule curModule = curProcess.MainModule)
                        {
                            hHook = Hooks.SetWindowsHookEx((int)Hooks.HookType.WH_KEYBOARD_LL, hookproc, Hooks.GetModuleHandle(curModule.ModuleName), 0);
                        }
                    }

                    Enabled = true;
                    return true;
                }
                catch
                {
                    Enabled = false;
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 禁用鍵盤鉤子處理
        /// </summary>
        /// <returns>如果禁用成功,則返回True</returns>
        public static bool Disable()
        {
            if (Enabled == true)
            {
                try
                {
                    Hooks.UnhookWindowsHookEx(hHook);
                    Enabled = false;
                    return true;
                }
                catch
                {
                    Enabled = true;
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        private static IntPtr Filter(int nCode, IntPtr wParam, IntPtr lParam)
        {
            bool result = true;

            if (nCode >= 0)
            {
                if (wParam == (IntPtr)Hooks.WM_KEYDOWN
                    || wParam == (IntPtr)Hooks.WM_SYSKEYDOWN)
                {
                    int vkCode = Marshal.ReadInt32(lParam);
                    if ((Keys)vkCode == Keys.LControlKey ||
                        (Keys)vkCode == Keys.RControlKey)
                        Control = true;
                    else if ((Keys)vkCode == Keys.LShiftKey ||
                        (Keys)vkCode == Keys.RShiftKey)
                        Shift = true;
                    else if ((Keys)vkCode == Keys.RMenu ||
                        (Keys)vkCode == Keys.LMenu)
                        Alt = true;
                    else if ((Keys)vkCode == Keys.RWin ||
                        (Keys)vkCode == Keys.LWin)
                        Win = true;
                    else
                        result = OnKeyDown((Keys)vkCode);
                }
                else if (wParam == (IntPtr)Hooks.WM_KEYUP
                    || wParam == (IntPtr)Hooks.WM_SYSKEYUP)
                {
                    int vkCode = Marshal.ReadInt32(lParam);
                    if ((Keys)vkCode == Keys.LControlKey ||
                        (Keys)vkCode == Keys.RControlKey)
                        Control = false;
                    else if ((Keys)vkCode == Keys.LShiftKey ||
                        (Keys)vkCode == Keys.RShiftKey)
                        Shift = false;
                    else if ((Keys)vkCode == Keys.RMenu ||
                        (Keys)vkCode == Keys.LMenu)
                        Alt = false;
                    else if ((Keys)vkCode == Keys.RWin ||
                        (Keys)vkCode == Keys.LWin)
                        Win = false;
                    else
                        result = OnKeyUp((Keys)vkCode);
                }
            }

            return result ? Hooks.CallNextHookEx(hHook, nCode, wParam, lParam) : new IntPtr(1);
        }

        /// <summary>
        /// 添加一個按下鍵的鉤子處理
        /// </summary>
        /// <param name="key">按下的鍵</param>
        /// <param name="callback">按鍵的處理事件函數</param>
        public static bool AddKeyDown(Keys key, KeyPressed callback)
        {
            KeyDown = null;
            if (!handledKeysDown.ContainsKey(key))
            {
                handledKeysDown.Add(key, callback);
                return true;
            }
            else
                return false;
        }

        /// <summary>
        /// 添加一個鍵彈起的鉤子處理
        /// </summary>
        /// <param name="key">彈起的鍵</param>
        /// <param name="callback">按鍵的處理事件函數</param>
        public static bool AddKeyUp(Keys key, KeyPressed callback)
        {
            if (!handledKeysUp.ContainsKey(key))
            {
                handledKeysUp.Add(key, callback);
                return true;
            }
            else
                return false;
        }

        /// <summary>
        /// 添加一個按下鍵的鉤子處理
        /// </summary>
        /// <param name="key">按下的鍵</param>
        /// <param name="callback">按鍵的處理事件函數</param>
        public static bool Add(Keys key, KeyPressed callback)
        {
            return AddKeyDown(key, callback);
        }

        /// <summary>
        /// 移除一個按下鍵的鉤子處理
        /// </summary>
        /// <param name="key">移除的按鍵</param>
        public static bool RemoveDown(Keys key)
        {
            return handledKeysDown.Remove(key);
        }

        /// <summary>
        /// 移除一個彈起鍵的鉤子處理
        /// </summary>
        /// <param name="key">移除的按鍵</param>
        public static bool RemoveUp(Keys key)
        {
            return handledKeysUp.Remove(key);
        }

        /// <summary>
        /// 移除一個鍵的鉤子處理
        /// </summary>
        /// <param name="key">移除的按鍵</param>
        public static bool Remove(Keys key)
        {
            return RemoveDown(key);
        }

        private static bool OnKeyDown(Keys key)
        {
            if (KeyDown != null)
                return KeyDown(key);
            if (handledKeysDown.ContainsKey(key))
                return handledKeysDown[key]();
            else
                return true;
        }

        private static bool OnKeyUp(Keys key)
        {
            if (handledKeysUp.ContainsKey(key))
                return handledKeysUp[key]();
            else
                return true;
        }

        /// <summary>
        /// 返回一個給定的鍵基於當前的控制鍵的字符串表示形式。
        /// </summary>
        /// <param name="key">當前的鍵</param>
        /// <returns></returns>
        public static string KeyToString(Keys key)
        {
            return (KeyboardHook.Control ? "Ctrl + " : "") +
                            (KeyboardHook.Alt ? "Alt + " : "") +
                            (KeyboardHook.Shift ? "Shift + " : "") +
                            (KeyboardHook.Win ? "Win + " : "") +
                            key.ToString();
        }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章