屏蔽系统快捷键——消息钩子

本文介绍如何使用C#实现全局键盘钩子,拦截特定按键,包括Win键、Ctrl+Esc等组合键,并展示了如何安装和移除钩子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Reflection; 
using System.Diagnostics; 
using Microsoft.Win32; 
 
namespace WindowsApplication1 
{ 
    public partial class Form2 : Form 
    { 
        //委托 
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam); 
        static int hHook = 0; 
        public const int WH_KEYBOARD_LL = 13; 
 
        //LowLevel键盘截获,如果是WH_KEYBOARD2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。 
        HookProc KeyBoardHookProcedure; 
 
        //键盘Hook结构函数 
        [StructLayout(LayoutKind.Sequential)] 
        public class KeyBoardHookStruct 
        { 
            public int vkCode; 
            public int scanCode; 
            public int flags; 
            public int time; 
            public int dwExtraInfo; 
        } 
        #region DllImport 
        //设置钩子 
        [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 void Hook_Start() 
        { 
            // 安装键盘钩子 
            if (hHook == 0) 
            { 
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); 
 
                //hHook = SetWindowsHookEx(2, 
                //            KeyBoardHookProcedure, 
                //          GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId()); 
 
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, 
                          KeyBoardHookProcedure, 
                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); 
 
                //如果设置钩子失败. 
                if (hHook == 0) 
                { 
                    Hook_Clear(); 
                    //throw new Exception("设置Hook失败!"); 
                } 
            } 
        } 
 
        //取消钩子事件 
        public void Hook_Clear() 
        { 
            bool retKeyboard = true; 
            if (hHook != 0) 
            { 
                retKeyboard = UnhookWindowsHookEx(hHook); 
                hHook = 0; 
            } 
            //如果去掉钩子失败. 
            if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed."); 
        } 
 
        //这里可以添加自己想要的信息处理 
        public 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 == 241)                  //截获F1 
                { 
                    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; 
                //} 
              
                //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); 
        } 
 
        #endregion 
 
        public Form2() 
        { 
            InitializeComponent(); 
        } 
        
        private void Form2_Load(object sender, EventArgs e) 
        { 
            Hook_Start(); 
 
            //通过修改注册表来屏蔽任务管理器 
            //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"); 
            //} 
        } 
 
        private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
        { 
            Hook_Clear(); 
        } 
 
        private void Form2_MouseMove(object sender, MouseEventArgs e) 
        { 
            System.Windows.Forms.Cursor.Clip = new Rectangle(this.Location, this.Size); //控制鼠标在窗口范围内 
        } 
    } 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值