首页 新闻 会员 周边

C#类 勾子 ,想在一个锁屏窗口屏蔽大部分能跳出界面的键盘按键,以下代码能运行,能调用,不报错,就是不起作用

0
悬赏园豆:100 [待解决问题]

class myHook
{
private IntPtr pKeyboardHook = IntPtr.Zero;//键盘钩子句柄
//钩子委托声明
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
private HookProc KeyboardHookProcedure;//键盘钩子委托实例,不能省略变量
public const int idHook = 13;//底层键盘钩子
//安装钩子
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadID);
//卸载钩子
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);

    //键盘钩子处理函数
    private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
    {
        KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));//键盘消息处理
        if (pKeyboardHook != IntPtr.Zero)//判断钩子句柄是否为空
        {
            switch (((Keys)m.vkCode))//判断按键
            { 
                case Keys.LWin://键盘左侧的Win键
                case Keys.RWin://键盘右侧的Win键
                case Keys.Delete://Delete键
                case Keys.Alt://Alt键
                case Keys.Escape: //Esc键
                case Keys.F4: //F4键
                case Keys.Control://Ctrl键
                case Keys.Tab://Tab键
                    return 1;//不执行任何操作
            }
        }
        return 0;
    }
    //安装钩子方法
    public bool InsertHook()
    {
        IntPtr pIn = (IntPtr)4194304;//将4194304转换为句柄
        if (this.pKeyboardHook == IntPtr.Zero)//不存在钩子时
        {
            //创建钩子
            this.KeyboardHookProcedure = new HookProc(KeyboardHookProc);
            //使用SetWindowsHookEx函数安装钩子
            this.pKeyboardHook = SetWindowsHookEx(idHook, KeyboardHookProcedure, pIn, 0);
            if (this.pKeyboardHook == IntPtr.Zero)//如果安装钩子失败
            {
                this.UnInsertHook();//卸载钩子
                return false;
            }
        }
        return true;
    }
    //卸载钩子方法
    public bool UnInsertHook()
    {
        bool result = true;
        if (this.pKeyboardHook != IntPtr.Zero)//如果存在钩子
        {
            //使用UnhookWindowsHookEx函数卸载钩子
            result = (UnhookWindowsHookEx(this.pKeyboardHook) && result);
            this.pKeyboardHook = IntPtr.Zero;//清空指针
        }
        return result;
    }
    //键盘消息处理结构
    [StructLayout(LayoutKind.Sequential)]
    public struct KeyMSG
    {
        public int vkCode;//键盘按键
    }
}

}

巅峰的路上的主页 巅峰的路上 | 初学一级 | 园豆:102
提问于:2020-10-16 11:50
< >
分享
所有回答(1)
0

权限够吗?挂钩子需要管理员权限

Arthurian | 园豆:1123 (小虾三级) | 2021-02-26 16:07

这个问题已经解决了,权限问题在软件运行时就已考虑。单独这个功能不能用,我就换了一套。
下面是调试成功的:

region 屏蔽WIN功能键

    public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
    private static int hHook = 0;
    public const int WH_KEYBOARD_LL = 13;

    //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,会在你截取之前获得键盘。 
    private static HookProc KeyBoardHookProcedure;
    //键盘Hook结构函数 
    [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 int GetCurrentThreadId();

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

    public static void Hook_Start()
    {
        // 安装键盘钩子 
        if (hHook == 0)
        {
            KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
            hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure,
                    GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
            //如果设置钩子失败. 
            if (hHook == 0)
            {
                Hook_Clear();
            }
        }
    }

    //取消钩子事件 
    public static void Hook_Clear()
    {
        bool retKeyboard = true;
        if (hHook != 0)
        {
            retKeyboard = UnhookWindowsHookEx(hHook);
            hHook = 0;
        }
        //如果去掉钩子失败. 
        if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
    }

    //这里可以添加自己想要的信息处理 
    private static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
    {
        if (nCode >= 0)
        {
            KeyBoardHookStruct 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 == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Alt) //新增截获alt+ESC
            {
                return 1;
            }


            if (kbh.vkCode == 241) //截获F1 
            {
                return 1;
            }

            //if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete)      //截获Ctrl+Alt+Delete 
            if(kbh.vkCode == (int)Keys.Delete && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt)
            {
                return 1;
            }
            if (kbh.vkCode == (int)Keys.Delete && ((int)Control.ModifierKeys == (int)Keys.Control+(int)Keys.Alt) )
            {
                return 1;
            }

            if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) //截获Ctrl+Shift 
            {
                return 1;
            }

            if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+空格 
            {
                return 1;
            }
        }

        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    public static void TaskMgrLocking(bool bLock)
    {
        if (bLock)
        {
            try
            {
                RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true);
                r.SetValue("DisableTaskmgr", "1"); //屏蔽任务管理器 
            }
            catch
            {
                RegistryKey r = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
                r.SetValue("DisableTaskmgr", "0");
            }
        }
        else
        {
            Registry.CurrentUser.DeleteSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
        }
    }
    #endregion


    //  调用,这个需要放在主窗体的load方法中
    //private void Load(object sender, EventArgs e)
    //{
    //    Hook_Start();
    //}

    //卸载
    //private void FormClosing(object sender, FormClosingEventArgs e)
    //{
    //    Hook_Clear();
    //}
}
支持(0) 反对(0) 巅峰的路上 | 园豆:102 (初学一级) | 2021-02-26 17:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册