C# 键盘钩子

橙三吉。 提交于 2021-02-15 06:30:39

C# 键盘钩子

 

1、键盘钩子:

通过代码将键盘的事件屏蔽掉,达到锁屏的效果。(参考地址:https://zhidao.baidu.com/question/135132386108196965.html)

2、代码如下:

public class Hook : IDisposable
    {
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam);

        private static int hHook;
        public const int WH_KEYBOARD_LL = 13;
        private HookProc KeyBoardHookProcedure;

        [StructLayout(LayoutKind.Sequential)]
        public class KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(int idHook);

        [DllImport("user32.dll")]
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);

        public void Start()
        {
            // 安装键盘钩子
            if (hHook == 0)
            {
                KeyBoardHookProcedure = KeyBoardHookProc;
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,
                    GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
                //如果设置钩子失败.
                if (hHook == 0)
                {
                    Close();
                }
                else
                {
                    var key = Registry.CurrentUser.OpenSubKey(
                        @"Software\Microsoft\Windows\CurrentVersion\Policies\System", true);
                    if (key == null) //如果该项不存在的话,则创建该项
                        key = Registry.CurrentUser.CreateSubKey(
                            @"Software\Microsoft\Windows\CurrentVersion\Policies\System");
                    key.SetValue("DisableTaskMgr", 1, RegistryValueKind.DWord);
                    key.Close();
                }
            }
        }

        public void Close()
        {
            var retKeyboard = true;
            if (hHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hHook);
                hHook = 0;
            }

            //如果去掉钩子失败.
            //if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
            var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System",
                true);
            if (key != null)
            {
                key.DeleteValue("DisableTaskMgr", false);
                key.Close();
            }
        }

        public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                var kbh = (KeyBoardHookStruct) Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
                if (kbh.vkCode == 91) // 截获左win(开始菜单键)
                    return 1;
                if (kbh.vkCode == 92) // 截获右win
                    return 1;
                if (kbh.vkCode == (int) Keys.Escape && (int) Control.ModifierKeys == (int) Keys.Control) //截获Ctrl+Esc
                    return 1;
                if (kbh.vkCode == (int) Keys.F4 && (int) Control.ModifierKeys == (int) Keys.Alt) //截获alt+f4
                    return 1;
                if (kbh.vkCode == (int) Keys.Tab && (int) Control.ModifierKeys == (int) Keys.Alt) //截获alt+tab
                    return 1;
                if (kbh.vkCode == (int) Keys.Escape &&
                    (int) Control.ModifierKeys == (int) Keys.Control + (int) Keys.Shift) //截获Ctrl+Shift+Esc
                    return 1;
                if (kbh.vkCode == (int) Keys.Space && (int) Control.ModifierKeys == (int) Keys.Alt) //截获alt+空格
                    return 1;
                if (kbh.vkCode == 241) //截获F1
                    return 1;
                if (kbh.vkCode == (int) Keys.Control && kbh.vkCode == (int) Keys.Alt && kbh.vkCode == (int) Keys.Delete)
                    return 1;
                if ((int) Control.ModifierKeys == (int) Keys.Control + (int) Keys.Alt + (int) Keys.Delete
                ) //截获Ctrl+Alt+Delete
                    return 1;
                if ((int) Control.ModifierKeys == (int) Keys.Control + (int) Keys.Shift) //截获Ctrl+Shift
                    return 1;
            }

            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }

        #region IDisposable 成员

        public void Dispose()
        {
            Close();
        }

        #endregion
    }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!