热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用C#屏蔽系统热键(包括禁止使用任务管理器)

一般来说会用到hook(钩子),即获取系统的按键或者鼠标动作,然后在系统响应之前执行自定义动作,或者直接截断这个消息,这就是屏蔽系统热键的原理了。
一般来说会用到hook(钩子),即获取系统的按键或者鼠标动作,然后在系统响应之前执行自定义动作,或者直接截断这个消息,
这就是屏蔽系统热键的原理了。
首先要调用操作系统的dll文件,先引入命名空间
using System.Runtime.InteropServices;
调用操作系统动态链接库的方法
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookExW(
            int idHook,
            HookHandlerDelegate lpfn,
            IntPtr hmod,
            uint dwThreadID);
第一个参数代表钩子ID(13代表键盘钩子,14代表鼠标钩子),第二个参数是一个函数指针,指向钩子需要执行的函数,第三个参数是指向进程块的指针,第四个参数默认为0就行了。
­
再引用一个获取进程块指针的方法
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(String modulename);
­
接下来就是构造一个钩子了(以键盘钩子为例)
定义常量:
        public const int WM_KEYDOWN = 0x0100;
        public const int WH_KEYBOARD_LL = 13;
        public const int WM_SYSKEYDOWN = 0x0104;
定义储存按键信息的结构体:
        public struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
定义一个函数指针:
        public delegate int HookHandlerDelegate(
            int nCode,
            IntPtr wparam,
            ref KBDLLHOOKSTRUCT lparam);
声明一个指向执行函数的函数指针:
        private HookHandlerDelegate proc;
构造钩子:
proc = new HookHandlerDelegate(HookCallback);
            using (Process curPro = Process.GetCurrentProcess())
            using (ProcessModule curMod = curPro.MainModule)
            {
                 SetWindowsHookExW(WH_KEYBOARD_LL,
                    proc,
                    GetModuleHandle(curMod.ModuleName),
                    0);
            }
这里的HookCallback即为钩子执行的函数,我是这样写的:
         private int HookCallback(int nCode,IntPtr wparam,ref KBDLLHOOKSTRUCT lparam)
        {
            if (
               nCode >= 0
               &&
               (wparam == (IntPtr)WM_KEYDOWN
               ||
               wparam == (IntPtr)WM_SYSKEYDOWN)
               )
            {
                if (lparam.vkCode == 91||lparam.vkCode==164||lparam.vkCode==9||lparam.vkCode==115)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            return 0;
        }
这里返回1代表消息终止,即不响应,返回0表示继续。这里的91,164,9,115即键盘的acsii值,表示屏蔽这些按键。
­
­
在此系统热键可以完全屏蔽掉了,但是这个方法却不能屏蔽ctrl+alt+del即弹出任务管理器的按键组合,这样就还是不能达到锁屏的效果
这里有个很简单的方法
FileStream  MyFs = new FileStream(Environment.ExpandEnvironmentVariables("%windir%system32   askmgr.exe"),
                                          FileMode.Open);
            byte[] Mybyte = new byte[(int)MyFs.Length];
            MyFs.Write(Mybyte, 0, (int)MyFs.Length);
即使用二进制流打开任务管理器,这样系统会认为任务管理器已经打开,使用ctrl+alt+del也就不会弹出任务管理器的窗口了,显然任务管理器已经打开,只不过在窗体界面是不会看见它罢了。

推荐阅读
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • HDU 2871 内存管理问题(线段树优化)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871。本题涉及内存管理操作,包括重置、申请、释放和查询内存块。通过使用线段树进行高效管理和维护。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了Java库XChart中的XYSeries类下的setLineColor()方法,并提供了多个实际应用场景的代码示例。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文介绍了一个经典的算法问题——活动选择问题,来源于牛客网的比赛题目。该问题要求从一系列活动集合中选出最多数量的相容活动,确保这些活动的时间段不重叠。 ... [详细]
  • 本文详细解析了2019年西安邀请赛中的一道树形动态规划题目——J题《And And And》。题目要求计算树中所有子路径异或值为0的集合数量,通过深入分析和算法优化,提供了高效的解决方案。 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • 本文详细介绍了Linux内核中misc设备驱动框架的实现原理及应用方法,包括misc设备的基本概念、驱动框架的初始化过程、数据结构分析以及设备的注册与注销流程。 ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
author-avatar
萌星
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有