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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。