热门标签 | 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也就不会弹出任务管理器的窗口了,显然任务管理器已经打开,只不过在窗体界面是不会看见它罢了。

推荐阅读
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 本文介绍了Java调用Windows下某些程序的方法,包括调用可执行程序和批处理命令。针对Java不支持直接调用批处理文件的问题,提供了一种将批处理文件转换为可执行文件的解决方案。介绍了使用Quick Batch File Compiler将批处理脚本编译为EXE文件,并通过Java调用可执行文件的方法。详细介绍了编译和反编译的步骤,以及调用方法的示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
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社区 版权所有