今天本来忙着写PPT,突然收到一条微信后台留言需求是如何在Win10下屏蔽Ctrl+alt+del键,不进入系统锁屏状态,最好是可以实现按下后弹出任务管理器。根据我多年写PPT的经验来看,这个需求如果一旦能实现屏蔽,那么弹出任务管理器基本可以随手就来。
首先我查看了下,运行该快捷键后弹出的是一个锁屏界面,上面可以让你选择运行什么内容,包括锁屏、任务管理器等等。(如下图)
那么要想实该需求有2种思路,1是直接通过windows系统预留的功能设置直接取消,获取更改成其他的快捷键,2是注册程序抢注热键,让使用者在操作过程中响应到其他程序界面。我们在查阅了简单的搜索后发现方法1行不通,系统并未预留相关的接口设置可以关闭,网上说的更多的是windows登录时候的取消该快捷键。
为了实现2的说法我们使用工具查询并未查到该热键是被什么程序注册,说明这个快捷键的响应不是通过注册快捷键的方式完成的。
尝试自己写程序注册ctrl+alt+del热键,发现注册是失败的,根据windows系统的RegisterHotKey 函数中的说法“如果为热键指定的击键已由另一个热键程序注册,则RegisterHotKey失败。” 并且还提到了F12这个按键作为调试器,是不允许其他程序注册的。那么说明有些按键是被系统管控,是不允许注册的。
我们终于在其他页面查到ctrl+alt+del是被 “Winlogon在初始化过程中作为第一个初始化事件注册了。” Winlogon 初始化是windows系统登录时候较早的一个过程,这样就弄明白了为什么这个热键改不掉,也不允许注册。
为了搞懂这个问题,尝试去查阅了键盘、鼠标相关输入逻辑(这里省去2天查阅资料学习时间的过程),在Windows的键盘与鼠标逻辑相关页面上查询到“一个键盘代码映射”的功能,该功能是为了满足程序员排查相关错误时候特意设计,将允许某些按键重定向到其他按键。
(谷歌翻译后的页面)
在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet004\Control\Keyboard Layout\ 项目中可以新建一个二进制值项:Scancode Map 。(在以上两个位置任意一个建立皆可)
这个项目可实现对键盘按键的映射。这里映射的意思可理解为“替换”,可将任意一键替换成其它键。项值的格式如下(以16进制表示,每两个0表示一字节,分五部分):
“Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,02,00,00,00,00,00
第一部分:8个 00 ,这是版本信息号。
第二部分:4个字节。表示映射键的总数。按照二进制数的读写规则,低位在左,高位在右,02 00 00 00 这个数实际就是:00 00 00 02 。从 02 开始,一个映射键是 02 ,两个是03 ,依次递加,十个是 0B 。
第三部分:2个字节。表示替换后按键的”扫描码“。如:ESC 键的扫描码是 01 ,所以就表示 01 00 。再如 左Ctrl键扫描码是 1D 00, 而右Ctrl键是 1D E0 。
第四部分:2个字节。表示原按键的”扫描码“。格式同上。
第五部分:以四个 00 结束。
如将 DEL 键映射为 = 键。= 键的扫描码是 0D ,DEL 键的扫描码是 E053。那么
“Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,0D,00,53,E0,00,00,00,00
导入后发现按键盘的快捷键没有反映了,这个时候自己写个程序注册ctrl+alt+=快捷键弹出任务管理器,就实现上述说的2个功能了。
相关链接
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/hid/keyboard-and-mouse-class-drivers
https://docs.microsoft.com/en-us/windows/win32/secauthn/initializing-winlogon
2022年01月09日
2021年08月21日
2021年05月11日
2021年05月11日
2021年05月11日