c# 屏蔽快捷键的实现示例
前言
有时候开发会遇到这样一个需求,软件需要屏蔽用户的组合快捷键或某些按键,避免强制退出软件,防止勿操作等。
原理
1、要实现组合键,按键拦截,需要用到user32.dll中的SetWindowsHookEx。
2、要拦截ctrl+alt+del,需要使用ntdll.dll的ZwSuspendProcess函数挂起winlogon程序,退出之后使用ZwResumeProcess恢复winlogon程序。
3、软件需要开启topMost,以及全屏,否则离开软件则拦截无效。
4、如果要实现热键监听(非焦点拦截),则需要用到user32.dll的RegisterHotKey以及UnregisterHotKey。
实现
1、Program类
usingSystem; usingSystem.Collections.Generic; usingSystem.Diagnostics; usingSystem.Runtime.InteropServices; usingSystem.Windows.Forms; namespaceLockForm { staticclassProgram { //////应用程序的主入口点。 /// [STAThread] staticvoidMain() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); SuspendWinLogon(); Application.Run(newForm1()); ResumeWinLogon(); } [DllImport("ntdll.dll")] publicstaticexternintZwSuspendProcess(IntPtrProcessId); [DllImport("ntdll.dll")] publicstaticexternintZwResumeProcess(IntPtrProcessId); privatestaticvoidSuspendWinLogon() { Process[]pc=Process.GetProcessesByName("winlogon"); if(pc.Length>0) { ZwSuspendProcess(pc[0].Handle); } } privatestaticvoidResumeWinLogon() { Process[]pc=Process.GetProcessesByName("winlogon"); if(pc.Length>0) { ZwResumeProcess(pc[0].Handle); } } } }
2、Form1类
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Diagnostics; usingSystem.Drawing; usingSystem.Runtime.InteropServices; usingSystem.Text; usingSystem.Windows.Forms; namespaceLockForm { publicpartialclassForm1:Form { publicForm1() { InitializeComponent(); } privatevoidbutton1_Click(objectsender,EventArgse) { if(textBox1.Text=="123") { Application.ExitThread(); } else { webBrowser1.Navigate(textBox1.Text); } } privatevoidForm1_Load(objectsender,EventArgse) { //webBrowser1.Navigate("https://baidu.com"); HookStart(); //this.TopMost=false; //SuspendWinLogon(); } privatevoidwebBrowser1_NewWindow(objectsender,CancelEventArgse) { e.Cancel=true; webBrowser1.Navigate(webBrowser1.Document.ActiveElement.GetAttribute("href")); } privatevoidbutton3_Click(objectsender,EventArgse) { webBrowser1.GoBack(); } privatevoidbutton2_Click(objectsender,EventArgse) { webBrowser1.GoForward(); } privatevoidbutton4_Click(objectsender,EventArgse) { webBrowser1.GoHome(); } privatevoidwebBrowser1_Navigated(objectsender,WebBrowserNavigatedEventArgse) { textBox1.Text=webBrowser1.Url.ToString(); } privatevoidwebBrowser1_Navigating(objectsender,WebBrowserNavigatingEventArgse) { } #region键盘钩子 publicdelegateintHookProc(intnCode,intwParam,IntPtrlParam);//定义全局钩子过程委托,以防被回收(钩子函数原型) HookProcKeyBoardProcedure; //定义键盘钩子的相关内容,用于截获键盘消息 staticinthHook=0;//钩子函数的句柄 publicconstintWH_KEYBOARD=13; //钩子结构函数 publicstructKeyBoardHookStruct { publicintvkCode; publicintscanCode; publicintflags; publicinttime; publicintdwExtraInfo; } //安装键盘钩子 publicvoidHookStart() { if(hHook==0) { //实例化一个HookProc对象 KeyBoardProcedure=newHookProc(Form1.KeyBoardHookProc); //创建线程钩子 hHook=Win32API.SetWindowsHookEx(WH_KEYBOARD,KeyBoardProcedure,Win32API.GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName),0); //如果设置线程钩子失败 if(hHook==0) { HookClear(); } } } //取消钩子 publicvoidHookClear() { boolrsetKeyboard=true; if(hHook!=0) { rsetKeyboard=Win32API.UnhookWindowsHookEx(hHook); hHook=0; } if(!rsetKeyboard) { thrownewException("取消钩子失败!"); } } //对截获的键盘操作的处理 publicstaticintKeyBoardHookProc(intnCode,intwParam,IntPtrlParam) { if(nCode>=0) { KeyBoardHookStructkbh=(KeyBoardHookStruct)Marshal.PtrToStructure(lParam,typeof(KeyBoardHookStruct)); if(kbh.vkCode==91)//截获左边WIN键 { return1; } if(kbh.vkCode==92)//截获右边WIN键 { return1; } if(kbh.vkCode==(int)Keys.Escape&&(int)Control.ModifierKeys==(int)Keys.Control)//截获Ctrl+ESC键 { return1; } if(kbh.vkCode==(int)Keys.Escape&&(int)Control.ModifierKeys==(int)Keys.Alt) { return1; } if(kbh.vkCode==(int)Keys.F4&&(int)Control.ModifierKeys==(int)Keys.Alt)//截获ALT+F4 { return1; } if(kbh.vkCode==(int)Keys.Tab&&(int)Control.ModifierKeys==(int)Keys.Alt)//截获ALT+TAB { return1; } if(kbh.vkCode==(int)Keys.Delete&&(int)Control.ModifierKeys==(int)Keys.Control+(int)Keys.Alt) { return1; } if(kbh.vkCode==(int)Keys.Escape&&(int)Control.ModifierKeys==(int)Keys.Control+(int)Keys.Alt)/*截获Ctrl+Shift+Esc*/ { return1; } } returnWin32API.CallNextHookEx(hHook,nCode,wParam,lParam); } #endregion } }
3、声明windowsapi
//设置钩子 [DllImport("user32.dll")] publicstaticexternintSetWindowsHookEx(intidHook,LockForm.Form1.HookProclpfn,IntPtrhInstance,intthreadID); //卸载钩子 [DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)] publicstaticexternboolUnhookWindowsHookEx(intidHook); //调用下一个钩子 [DllImport("user32.dll")] publicstaticexternintCallNextHookEx(intidHook,intnCode,intwParam,IntPtrlParam);
PS:
windowsapi查询
http://www.pinvoke.net/index.aspx
demo下载
链接:http://pan.baidu.com/s/1jGpOvsE密码:dbj2
以上就是c#屏蔽快捷键的实现示例的详细内容,更多关于c#屏蔽快捷键的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。