C#使用API屏蔽系统热键和任务管理器
最近做的一个winform类型的项目中需要屏蔽系统热键,在网上搜索了一下,基本上都是调用api来进行hook操作,下面的代码就可以完成功能
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms; namespace WAT.PMS
{ /// <summary>
/// Description: Hook Helper类,可以屏蔽一些热键并屏蔽任务管理器
/// Author: ZhangRongHua
/// Create DateTime: 2009-6-19 20:21
/// UpdateHistory:
/// </summary>
public class HookHelper
{
#region Delegates public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); #endregion #region 变量声明 private HookProc KeyboardHookProcedure;
private FileStream MyFs; // 用流来屏蔽ctrl alt delete private const byte LLKHF_ALTDOWN = 0x20;
private const byte VK_CAPITAL = 0x14;
private const byte VK_ESCAPE = 0x1B;
private const byte VK_F4 = 0x73;
private const byte VK_LCONTROL = 0xA2;
private const byte VK_NUMLOCK = 0x90;
private const byte VK_RCONTROL = 0xA3;
private const byte VK_SHIFT = 0x10;
private const byte VK_TAB = 0x09;
public const int WH_KEYBOARD = 13;
private const int WH_KEYBOARD_LL = 13;
private const int WH_MOUSE = 7;
private const int WH_MOUSE_LL = 14;
private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_LBUTTONUP = 0x202;
private const int WM_MBUTTONDBLCLK = 0x209;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_MBUTTONUP = 0x208;
private const int WM_MOUSEMOVE = 0x200;
private const int WM_MOUSEWHEEL = 0x020A;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_RBUTTONUP = 0x205;
private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105;
private static int hKeyboardHook = 0; #endregion #region 函数转换 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
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", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); // 取得当前线程编号 [DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId(); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern short GetKeyState(int vKey); #endregion #region 方法 /// <summary>
/// 钩子回调函数,在这里屏蔽热键。
/// <remark>
/// Author:ZhangRongHua
/// Create DateTime: 2009-6-19 20:19
/// Update History:
/// </remark>
/// </summary>
/// <param name="nCode">The n code.</param>
/// <param name="wParam">The w param.</param>
/// <param name="lParam">The l param.</param>
/// <returns></returns>
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof (KeyMSG)); if (((Keys) m.vkCode == Keys.LWin) || ((Keys) m.vkCode == Keys.RWin) ||
((m.vkCode == VK_TAB) && ((m.flags & LLKHF_ALTDOWN) != 0)) ||
((m.vkCode == VK_ESCAPE) && ((m.flags & LLKHF_ALTDOWN) != 0)) ||
((m.vkCode == VK_F4) && ((m.flags & LLKHF_ALTDOWN) != 0)) ||
(m.vkCode == VK_ESCAPE) && ((GetKeyState(VK_LCONTROL) & 0x8000) != 0) ||
(m.vkCode == VK_ESCAPE) && ((GetKeyState(VK_RCONTROL) & 0x8000) != 0)
)
{
return 1;
} return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
/// <summary>
/// 启动Hook,并用流屏蔽任务管理器
/// <remark>
/// Author:ZhangRongHua
/// Create DateTime: 2009-6-19 20:20
/// Update History:
/// </remark>
/// </summary>
public void HookStart()
{
if (hKeyboardHook == 0)
{
// 创建HookProc实例 KeyboardHookProcedure = new HookProc(KeyboardHookProc); hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
0); // 如果设置钩子失败 if (hKeyboardHook == 0)
{
HookStop(); //throw new Exception("SetWindowsHookEx failedeeeeeeee.");
} //用二进制流的方法打开任务管理器。而且不关闭流.这样任务管理器就打开不了
MyFs = new FileStream(Environment.ExpandEnvironmentVariables("%windir%\\system32\\taskmgr.exe"),
FileMode.Open);
byte[] MyByte = new byte[(int) MyFs.Length];
MyFs.Write(MyByte, 0, (int) MyFs.Length);
}
} /// <summary>
/// 卸载hook,并关闭流,取消屏蔽任务管理器。
/// <remark>
/// Author:ZhangRongHua
/// Create DateTime: 2009-6-19 20:21
/// Update History:
/// </remark>
/// </summary>
public void HookStop()
{
bool retKeyboard = true; if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0;
} if (null != MyFs)
{
MyFs.Close();
} if (!(retKeyboard))
{
throw new Exception("UnhookWindowsHookEx failedsssss.");
}
} #endregion #region Nested type: KeyMSG public struct KeyMSG
{
public int dwExtraInfo;
public int flags;
public int scanCode; public int time;
public int vkCode;
} #endregion
}
}
PS:也可以通过将[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] 下的DisableTaskmgr项的值设为"1”来屏蔽任务管理器。
也可以参考:如何使用注册表禁用任务管理器http://jingyan.baidu.com/article/1e5468f91d8813484861b769.html 百度经验
参考:http://www.cnblogs.com/zhangronghua/archive/2009/06/19/1507031.html
C#使用API屏蔽系统热键和任务管理器的更多相关文章
- 屏蔽系统热键钩子Hook程序
在winform时候,经常需要做屏蔽系统热键: 1.屏蔽左"WIN".右"Win" 2.屏蔽Ctrl+Esc 3.屏蔽Alt+f4 4.屏蔽Alt+Esc 5. ...
- C#实现全局快捷键(系统热键)响应(转)
转自http://www.cnblogs.com/Randy0528/archive/2013/02/04/2892062.html 在应用中,我们可能会需要实现像Ctrl+C复制.Ctrl+V粘贴这 ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- JavaScript 获取按键,并屏蔽系统 Window 事件
// JavaScript 获取按键,并屏蔽系统 Window 事件 window.document.onkeydown = onkeydown; function onkeydown(event) ...
- Android6.0 源码修改之屏蔽系统短信功能和来电功能
一.屏蔽系统短信功能 1.屏蔽所有短信 android 4.2 短信发送流程分析可参考这篇 戳这 源码位置 vendor\mediatek\proprietary\packages\apps\Mms\ ...
- Thinkpad 笔记本 装win7 64 位操作系统热键驱动装不上问题解决!
Thinkpad 笔记本 装win7 64 位操作系统热键驱动装不上问题解决! 一般牛人的解释如下: 问题终于搞定.是因为需要手工建%PROGRAMFILES%\Lenovo\Hotkey目录.这个写 ...
- Tkenter之API测试系统界面设计
# -*- coding: UTF-8 -*- from Tkinter import * tk=Tk() tk.geometry('500x400+500+200') tk.title('API测试 ...
- Laravel 的 API 认证系统 Passport 三部曲(二、passport的具体使用)
GQ1994 关注 2018.04.20 09:31 字数 1152 阅读 1316评论 0喜欢 1 参考链接 Laravel 的 API 认证系统 Passport 三部曲(一.passport安装 ...
随机推荐
- February 11 2017 Week 6 Saturday
Love means never having to say you're sorry. 爱就是永远不必说对不起. Yesterday I heard an interesting story fro ...
- 【2D游戏引擎】那些年对游戏对象的思考
WIP源代码: Github OSC镜像 对象系统以对象为中心,对象系统的最基本设计策略是基于组件的设计.对象系统将尽量避免使用继承方式来拓展游戏对象,恰当的使用Mix-in来来最属性做拓展,单个属性 ...
- GPU 与CPU的作用协调,工作流程、GPU整合到CPU得好处
http://blog.csdn.net/maopig/article/details/6803141 在不少人的心目中,显卡最大的用途可能就只有两点——玩游戏.看电影,除此之外,GPU并没有其他的作 ...
- UVa 12034 - Race(递推 + 杨辉三角)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- BZOJ1614:[USACO]Telephone Lines架设电话线(二分,最短路)
Description FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司 支付一定的费用.FJ的农场周围分布着N(1<=N< ...
- Codeforces Round #533 (Div. 2) B. Zuhair and Strings 【模拟】
传送门:http://codeforces.com/contest/1105/problem/B B. Zuhair and Strings time limit per test 1 second ...
- 掺合模式(Mixin)
Mixin是JavaScript中用的最普遍的模式,可以就任意一个对象的全部或部分属性拷贝到另一个对象上.从提供的接口来看,有的是对对象的操作,有的是对类的操作.对类的操作又称为掺元类(Mixin c ...
- 二、Shiro 认证开发
I.java开发 环境准备 <dependencies> <dependency> <groupId>junit</groupId> <artif ...
- MySQL中的事件/定时任务
转载自:http://www.cnblogs.com/chenpi/p/5137310.html 什么是事件 一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行, ...
- 基于jQuery+JSON的省市县 二级 三级 联动效果
省市区联动下拉效果在WEB中应用非常广泛,尤其在一些会员信息系统.电商网站最为常见.开发者一般使用Ajax实现无刷新下拉联动.本文将讲述,利用jQuery插件,通过读取JSON数据,实现无刷新动态下拉 ...