You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows键盘过滤驱动开发:代码常量含义与动态控制问询

代码数值含义解析

这段代码的实际逻辑并非禁用退格键,而是将所有退格键的按下/释放事件替换为回车键事件,各数值含义如下:

  • 0x0E:PS/2键盘Set1标准中,普通退格键(Backspace)的Make Code(按键按下时的扫描码),对应无扩展前缀(KEY_E0/KEY_E1)的常规退格操作。
  • 0x53:PS/2键盘Set1标准中,带E0扩展前缀的退格键扫描码,对应右侧退格键(或部分键盘的扩展退格)的Make Code,因此代码中通过Flags & KEY_E0 != 0来匹配这类场景。
  • 0x80:扫描码的最高位标记,当该位为1时,表示当前是Break Code(按键松开时的扫描码)。代码中pData->MakeCode & ~0x80的作用是屏蔽该标记位,只提取按键本身的扫描码,统一处理按下和松开两种状态。
  • 0x1C:PS/2键盘Set1标准中,回车键(Enter)的Make Code。代码将匹配到的退格键扫描码替换为该值,同时保留原有的0x80位(确保按下/释放状态不变),相当于把退格键的操作替换为回车。
驱动动态加载卸载与状态交互方案

动态加载卸载

Windows内核驱动支持系统启动后动态加载和卸载,但需满足以下条件:

  • 驱动启动类型必须设置为DEMAND_START(手动启动),不能是BOOT_START或SYSTEM_START(这类驱动仅能在系统启动阶段加载)。
  • 加载可通过命令行工具完成:先用sc create创建驱动服务,再用sc start启动服务;卸载前需先执行sc stop停止服务,再用sc delete删除服务,也可使用DevCon等工具简化操作。
  • 卸载时必须确保驱动已释放所有资源,例如断开与上层键盘设备的过滤连接、销毁所有WDF设备对象等,否则可能引发系统蓝屏或不稳定。

状态交互(按需拦截输入)

要实现“仅在必要时拦截输入”,必须实现用户态客户端与内核驱动的交互,最常用的方案是通过自定义IOCTL:

  1. 内核驱动端:
    • 定义自定义控制码(如IOCTL_SET_FILTER_STATE)。
    • 在驱动的DispatchIoControl回调中处理该IOCTL,接收用户态传来的状态(如是否开启过滤),并在内核中保存为全局标志(例如BOOLEAN g_EnableFilter)。
    • 在KbFilter_ServiceCallback中先检查该全局标志,仅当标志为TRUE时,才执行过滤逻辑(拦截非数字键)。
  2. 用户态客户端:
    • 通过CreateFile打开驱动设备对象。
    • 调用DeviceIoControl发送IOCTL命令,将当前需要的过滤状态传递给驱动。

通过这种方式即可实现动态控制驱动是否拦截输入的需求。

内容的提问来源于stack exchange,提问作者nullrefexc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:32:52