1
2
3
4
5
6
7
8
9
10
11
[硬件层]

[HAL - 硬件中断处理]

[HID层: HID Miniport Driver → HID Class Driver]

[输入堆栈: Device Driver → Filter Driver → Class Driver]

[Windows输入子系统: 内核模式输入管理器 → 用户模式输入管理器]

[用户模式: Raw Input / 窗口消息 / DirectInput]

硬件层 (Hardware Layer)

实际的物理设备(如鼠标、键盘)通过S/2、USB 或其他标准协议通过输入信号触发硬件中断

硬件抽象层 (HAL - Hardware Abstraction Layer)

Windows操作系统通过HAL屏蔽硬件细节,捕获硬件中断并将其传递给输入设备驱动,提供通用接口供上层驱动程序使用。

HID 层 (Human Interface Device Layer)

完成从设备信号到逻辑输入事件的映射,这些事件随后被传递到输入堆栈

HID Miniport Driver:每种设备(例如鼠标)都有特定的设备驱动程序,负责解析硬件协议并传递数据。

HID Class Driver (hidclass.sys):HID设备类驱动是一个标准化的接口,负责将低级别的设备事件包装成更高层次的消息。

输入堆栈 (Input Stack)

输入堆栈中包含多个层级的驱动程序和组件,处理输入事件的进一步传递和解析,然后会被封装成标准的输入事件供更高层处理

设备驱动 (Device-Specific Driver):

通常是标准的 mouhid.sys 或其他供应商驱动

负责进一步将硬件信号翻译为操作系统可以理解的数据格式

类驱动程序 (Class Driver):

鼠标:MouClass.sys

键盘:KbdClass.sys

这些类驱动程序接收事件并进行初步处理,例如缓冲数据或聚合事件。(各种鼠标聚合)

过滤驱动程序 (Filter Driver):

可用于拦截和修改输入事件。

例如,鼠标过滤驱动程序可以插入到设备驱动和类驱动之间。

Windows输入子系统 (Windows Input Subsystem)

位于内核模式和用户模式,负责输入事件的分发和调度

内核模式输入管理器:

包括 Win32k.sys(负责将输入事件传递到图形子系统)。

用户模式输入管理器:

通过 User32.dll 管理窗口消息(如 WM_MOUSEMOVE, WM_LBUTTONDOWN)。

在这个阶段,SendInput API 注入的模拟事件也会进入消息队列,与物理设备事件混合在一起。

用户模式层 (User Mode Layer)

在此处输入事件最终被传递到应用程序,Windows将系统消息队列中的消息分发到目标窗口所属的线程的消息队列中,注意只有GUI线程用于自己的消息队列

更多接口访问

Raw Input API:

提供对原始输入设备数据的访问,例如设备来源、坐标、按钮状态等。

Windows消息队列:

应用程序通过标准的消息循环 (GetMessage 或 PeekMessage) 接收事件。

事件如鼠标点击或移动被包装成窗口消息。

DirectInput / XInput:

主要用于游戏开发,直接访问输入设备数据。