博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于winform屏蔽锁
阅读量:6407 次
发布时间:2019-06-23

本文共 4833 字,大约阅读时间需要 16 分钟。

在项目里经常要设计一个窗体全屏,然后屏蔽一些窗体的事件,比如 屏蔽开始按钮  alt+F4等等按钮,这里给出示例代码希望对大家有帮助

1         static int hHook = 0; //全局钩子数   2   3         public const int WH_KEYBOARD_LL = 13;  //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取   4   5         //委托     6         public delegate int HookProc(int nCode, int wParam, IntPtr lParam);   7         event HookProc KeyBoardHookProcedure;   8   9         //键盘Hook结构   10         [StructLayout(LayoutKind.Sequential)]  11         public class KeyBoardHookStruct  12         {
13 public int vkCode; 14 public int scanCode; 15 public int flags; 16 public int time; 17 public int dwExtraInfo; 18 } 19 20 #region DllImport 21 //设置钩子 22 [DllImport("user32.dll")] 23 public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 24 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 25 //抽掉钩子 26 public static extern bool UnhookWindowsHookEx(int idHook); 27 [DllImport("user32.dll")] 28 //调用下一个钩子 29 public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); 30 31 [DllImport("kernel32.dll")] 32 public static extern int GetCurrentThreadId(); 33 34 [DllImport("kernel32.dll")] 35 public static extern IntPtr GetModuleHandle(string name); 36 37 #endregion 38 39 #region 自定义事件函数 40 41 public void Hook_Start() 42 {
43 // 安装键盘钩子 44 if (hHook == 0) 45 {
46 KeyBoardHookProcedure = new HookProc(KeyBoardHookProc); 47 48 hHook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyBoardHookProcedure,GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); 49 50 //如果设置钩子失败. 51 if (hHook == 0) 52 {
53 Hook_Clear(); 54 //throw new Exception("设置Hook失败!"); 55 } 56 } 57 } 58 59 //取消钩子事件 60 public void Hook_Clear() 61 {
62 bool retKeyboard = true; 63 if (hHook != 0) 64 {
65 retKeyboard = UnhookWindowsHookEx(hHook); 66 hHook = 0; 67 } 68 //如果去掉钩子失败. 69 if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed."); 70 } 71 72 //这里添加自己想要的信息处理 73 public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam) 74 {
75 if (nCode >= 0) 76 {
77 KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); 78 if (kbh.vkCode == 91) // 截获左win(开始菜单键) 79 {
80 return 1; 81 } 82 if (kbh.vkCode == 92)// 截获右win 83 {
84 return 1; 85 } 86 //截获Ctrl+Esc 87 if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control) 88 {
89 return 1; 90 } 91 //截获alt+f4 92 if (kbh.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt) 93 {
94 return 1; 95 } 96 //截获alt+tab 97 if (kbh.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt) 98 {
99 return 1; 100 } 101 //截获Ctrl+Shift+Esc 102 if (kbh.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift) 103 {
104 return 1; 105 } 106 //截获alt+空格 107 if (kbh.vkCode == (int)Keys.Space && (int)Control.ModifierKeys == (int)Keys.Alt) 108 {
109 return 1; 110 } 111 //截获Ctrl+Alt+Delete 112 if ((int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete) 113 {
114 return 1; 115 } 116 117 118 } 119 return CallNextHookEx(hHook, nCode, wParam, lParam); 120 } 121 122 #endregion 123 124 125 private void frmMain_Load(object sender, EventArgs e) 126 {
127 Hook_Start(); 128 } 129 130 private void frmMain_FormClosing(object sender, FormClosingEventArgs e) 131 {
132 Hook_Clear(); 133 }

 

代码基本就是这样,如果不明白可以大家交流一下

转载地址:http://aqqea.baihongyu.com/

你可能感兴趣的文章
linux安全--用户账号--文件系统--用户切换与sudo提权
查看>>
搭建Kiwi_Syslog日志服务器
查看>>
设置DAG共享见证服务器“拒绝访问”报错解决方法
查看>>
通过Postfix构建Exchange Server 2010邮件网关部署系列一:创建新域环境
查看>>
过Postfix构建Exchange Server 2010邮件网关部署系列三:安装Exchange 2010先决性条件
查看>>
VNC服务的配置
查看>>
mutt+msmtp 配置
查看>>
2011年软件收入百强名单 华为826亿居首
查看>>
浙江省测绘与地理信息局异地备份和容灾项目
查看>>
关于View类一些方法的调用
查看>>
联通IDC机房促销
查看>>
线程状态与线程控制
查看>>
F5助客户从容应对Web部署与云部署带来的应用性能挑战
查看>>
Freemarker 使用
查看>>
Oracle初学入门
查看>>
常见黑盒测试方法【转】
查看>>
云备份
查看>>
我的友情链接
查看>>
文本文件操作命令cut wc sort uniq tr
查看>>
在centos7上实现RAID5,并作坏盘测试
查看>>