• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#键盘钩子

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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
    }

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#中base关键字的几种用法发布时间:2022-07-10
下一篇:
转:C#调用C++的DLL搜集整理的所有数据类型转换方式发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap