C# 鍵盤鉤子

C# 鍵盤鉤子html

 

一、鍵盤鉤子:

經過代碼將鍵盤的事件屏蔽掉,達到鎖屏的效果。(參考地址:https://zhidao.baidu.com/question/135132386108196965.html)spa

二、代碼以下:

 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
    }
相關文章
相關標籤/搜索