有时候开发会遇到这样一个需求,软件需要屏蔽用户的组合快捷键或某些按键,避免强制退出软件,防止勿操作等。
1、要实现组合键,按键拦截,需要用到user32.dll中的SetWindowsHookEx。
2、要拦截ctrl+alt+del,需要使用ntdll.dll的ZwSuspendProcess函数挂起winlogon程序,退出之后使用ZwResumeProcess恢复winlogon程序。
3、软件需要开启topMost,以及全屏,否则离开软件则拦截无效。
4、如果要实现热键监听(非焦点拦截),则需要用到user32.dll的RegisterHotKey以及UnregisterHotKey。
using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace LockForm { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); SuspendWinLogon(); Application.Run(new Form1()); ResumeWinLogon(); } [DllImport("ntdll.dll")] public static extern int ZwSuspendProcess(IntPtr ProcessId); [DllImport("ntdll.dll")] public static extern int ZwResumeProcess(IntPtr ProcessId); private static void SuspendWinLogon() { Process[] pc = Process.GetProcessesByName("winlogon"); if (pc.Length > 0) { ZwSuspendProcess(pc[0].Handle); } } private static void ResumeWinLogon() { Process[] pc = Process.GetProcessesByName("winlogon"); if (pc.Length > 0) { ZwResumeProcess(pc[0].Handle); } } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace LockForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == "123") { Application.ExitThread(); } else { webBrowser1.Navigate(textBox1.Text); } } private void Form1_Load(object sender, EventArgs e) { //webBrowser1.Navigate("https://baidu.com"); HookStart(); //this.TopMost = false; //SuspendWinLogon(); } private void webBrowser1_NewWindow(object sender, CancelEventArgs e) { e.Cancel = true; webBrowser1.Navigate(webBrowser1.Document.ActiveElement.GetAttribute("href")); } private void button3_Click(object sender, EventArgs e) { webBrowser1.GoBack(); } private void button2_Click(object sender, EventArgs e) { webBrowser1.GoForward(); } private void button4_Click(object sender, EventArgs e) { webBrowser1.GoHome(); } private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { textBox1.Text = webBrowser1.Url.ToString(); } private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) { } #region 键盘钩子 public delegate int HookProc(int nCode, int wParam, IntPtr lParam);//定义全局钩子过程委托,以防被回收(钩子函数原型) HookProc KeyBoardProcedure; //定义键盘钩子的相关内容,用于截获键盘消息 static int hHook = 0;//钩子函数的句柄 public const int WH_KEYBOARD = 13; //钩子结构函数 public struct KeyBoardHookStruct { public int vkCode; public int scanCode; public int flags; public int time; public int dwExtraInfo; } //安装键盘钩子 public void HookStart() { if (hHook == 0) { //实例化一个HookProc对象 KeyBoardProcedure = new HookProc(Form1.KeyBoardHookProc); //创建线程钩子 hHook = Win32API.SetWindowsHookEx(WH_KEYBOARD, KeyBoardProcedure, Win32API.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); //如果设置线程钩子失败 if (hHook == 0) { HookClear(); } } } //取消钩子 public void HookClear() { bool rsetKeyboard = true; if (hHook != 0) { rsetKeyboard = Win32API.UnhookWindowsHookEx(hHook); hHook = 0; } if (!rsetKeyboard) { throw new Exception("取消钩子失败!"); } } //对截获的键盘操作的处理 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.Escape && (int)Control.ModifierKeys == (int)Keys.Alt) { 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.Delete&&(int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) { return 1; } if ( kbh.vkCode == (int) Keys.Escape && (int) Control.ModifierKeys == (int) Keys.Control + (int) Keys.Alt ) /* 截获Ctrl+Shift+Esc */ { return 1; } } return Win32API.CallNextHookEx(hHook, nCode, wParam, lParam); } #endregion } }
//设置钩子 [DllImport("user32.dll")] public static extern int SetWindowsHookEx(int idHook, LockForm.Form1.HookProc lpfn, IntPtr hInstance, int threadID); //卸载钩子 [DllImport("user32.dll", 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);
windows api查询
http://www.pinvoke.net/index.aspx
demo下载
链接:http://pan.baidu.com/s/1jGpOvsE 密码:dbj2
以上就是c# 屏蔽快捷键的实现示例的详细内容,更多关于c# 屏蔽快捷键的资料请关注小牛知识库其它相关文章!
本文向大家介绍Python3.7.0 Shell添加清屏快捷键的实现示例,包括了Python3.7.0 Shell添加清屏快捷键的实现示例的使用技巧和注意事项,需要的朋友参考一下 1、找到python的安装目录在python (版本号)\lib\idlelib目录下 添加Clearwindow.py文件 源代码如下: 2、继续在当前目录下(python (版本号)\lib\idlelib)打开编辑
本文向大家介绍C#中实现屏蔽Ctrl+C的方法,包括了C#中实现屏蔽Ctrl+C的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现屏蔽Ctrl+C的方法,代码简单易懂,具有一定的实用价值。分享给大家供大家参考。具体方法如下: 主要实现方法为重写 WndProc,代码如下: 希望本文所述C#实例对大家有所帮助。
本文向大家介绍C# WinForm中实现快捷键自定义设置实例,包括了C# WinForm中实现快捷键自定义设置实例的使用技巧和注意事项,需要的朋友参考一下 本文源码下载:http://xiazai.jb51.net/201501/tools/cs-key-setting.rar 项目开发过程中,需要实现类似有道词典的软件设置中的自定义快捷键功能,如下图所示: 当我们相继按下Ctrl+Alt+M的时
本文向大家介绍web 屏蔽BackSpace键实例代码,包括了web 屏蔽BackSpace键实例代码的使用技巧和注意事项,需要的朋友参考一下 在web端,输入的时候,很容易在文本框消失焦点的时候,点击退格键,页面就回退了,下面是一种屏蔽页面回退键的方法(在网上找的,具体的地址忘记了!!!)。 以上所述是小编给大家介绍的web 屏蔽BackSpace键实例代码,希望对大家有所帮助,如果大家有任何疑
本文向大家介绍C#实现快捷键的几种常用方法汇总,包括了C#实现快捷键的几种常用方法汇总的使用技巧和注意事项,需要的朋友参考一下 快捷键是很多软件的常用功能,本文实例讲解了三种方法来实现C# button快捷键,如Alt + *(按钮快捷键),Ctrl+*及其他组合键等。现详述如下: 一、 C# button快捷键之第一种:Alt + *(按钮快捷键) 在大家给button、label、menuSt
本文向大家介绍pycharm 实现复制一行的快捷键,包括了pycharm 实现复制一行的快捷键的使用技巧和注意事项,需要的朋友参考一下 如下所示: 快捷键 说明 ctrl + c 直接在要复制的哪一行按下快捷键,即可将当前行内容复制到剪切板 ctrl + d 复制当前行到下一行 TIP:上述快捷键都无需选中 补充:PyCharm中的复制粘贴快捷键不能用怎么办 运行PyCharm-->File-->