zoukankan      html  css  js  c++  java
  • 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

        }

     

    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 }
  • 相关阅读:
    springmvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
    数据库中的锁机制
    在inux中安装redis的时候,会出现下面的这个异常
    使用SecureCRT操作linux系统时候的简单设置
    装饰者设计模式
    java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.
    事务
    2.6.1 测试架构师
    测试专家讲述通往测试架构师之路
    什么是软件测试架构师
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14274741.html
Copyright © 2011-2022 走看看