Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

4.2 键盘与输入设备

输入设备是我们向计算机输入信息的接口,键盘、鼠标、触摸板、触摸屏等都是最常见的输入设备。理解输入设备的工作原理,有助于我们更好地处理用户输入,优化交互体验。

键盘的工作原理

键盘是最常用的输入设备,我们每天都在使用,但你知道按下一个按键到屏幕上显示出字符,中间经过了多少处理流程吗?

键盘的分类

1. 薄膜键盘

  • 结构:上下两层导电薄膜,中间有绝缘层,按键按下时两层薄膜接触,电路导通
  • 优点:成本低、噪音小、寿命长(一般1000万次敲击寿命)
  • 缺点:手感差,没有段落感,按键冲突较多
  • 适用场景:普通办公、日常使用

2. 机械键盘

  • 结构:每个按键都是一个独立的机械轴,常见的轴有青轴、红轴、茶轴、黑轴等
  • 优点:手感好,有段落感,按键冲突少,寿命长(一般5000万次敲击寿命)
  • 缺点:成本高、噪音大(青轴)
  • 适用场景:游戏、程序员、对输入手感有要求的用户

3. 静电容键盘

  • 结构:利用电容容量变化来检测按键按下,不需要物理接触
  • 优点:手感顺滑,寿命极长(1亿次以上敲击寿命),噪音小
  • 缺点:价格昂贵
  • 适用场景:高端用户、专业打字员

键盘的工作流程

当你按下一个按键时,键盘内部的微控制器会检测到按键按下,然后向计算机发送对应的扫描码(Scan Code):

  1. 按键检测:键盘的微控制器周期性扫描按键矩阵,检测哪个按键被按下或释放
  2. 生成扫描码:根据按下的按键,生成对应的扫描码,按下按键发送通码(Make Code),释放按键发送断码(Break Code)
  3. 发送到主机:通过USB/PS2接口将扫描码发送给计算机的键盘控制器
  4. 操作系统处理:操作系统的键盘驱动收到扫描码,转换为对应的虚拟键码(Virtual Key Code),然后生成键盘事件放入系统消息队列
  5. 应用程序处理:应用程序从消息队列中获取键盘事件,做出对应的处理(比如输入字符、触发快捷键等)

扫描码与键码

扫描码(Scan Code)

  • 是键盘硬件产生的编码,和具体的硬件相关,同一个按键在不同键盘上的扫描码可能不同
  • 按下按键时发送通码,释放按键时发送断码(通常是通码加上0x80)
  • 常见的扫描码集有XT、AT、PS/2等

虚拟键码(Virtual Key Code)

  • 操作系统定义的按键编码,和硬件无关,同一个按键的虚拟键码在系统中是固定的
  • 比如Windows中VK_ENTER代表回车键,VK_A代表A键
  • 操作系统会把扫描码转换为虚拟键码,提供给上层应用使用

字符编码

  • 操作系统根据当前的输入法和键盘布局,将虚拟键码转换为对应的字符编码(比如UTF-8)
  • 这就是为什么同一个按键在不同的输入法下会输入不同的字符

按键冲突(Key Rollover)

按键冲突是指同时按下多个按键时,键盘无法正确识别所有按键的情况:

  • 普通薄膜键盘:通常只能支持2-3键无冲,同时按下多个键会出现冲突,无法正确识别
  • 游戏键盘/机械键盘:通常支持6键无冲,甚至全键无冲(N-Key Rollover,NKRO),同时按下所有按键都能正确识别
  • 对于游戏玩家和需要大量快捷键的用户,按键无冲很重要

键盘事件处理流程

我们以Windows系统为例,看一下从按键按下到应用程序收到事件的完整流程:

用户按下按键 → 键盘发送扫描码 → 键盘控制器接收 → 发送中断信号给CPU → 中断处理程序读取扫描码 → 转换为虚拟键码 → 生成键盘消息(WM_KEYDOWN/WM_CHAR等) → 发送到对应线程的消息队列 → 应用程序从消息队列取出消息 → 处理事件

常见的键盘事件

  1. 按键按下事件(Key Down):按键被按下时触发
  2. 按键释放事件(Key Up):按键被释放时触发
  3. 字符输入事件(Char / Key Press):按键按下后产生可输入字符时触发

开发中的常见问题

  1. 输入法冲突:处理快捷键的时候要注意输入法状态,比如中文输入法下的按键和英文输入法下可能不同
  2. 重复按键:按键按住不放会连续触发按键事件,可以通过系统设置调整重复延迟和重复速度
  3. 组合键处理:处理Ctrl、Shift、Alt等修饰键的组合,需要检测修饰键的状态
  4. 全局快捷键:注册系统级的全局快捷键,需要调用操作系统的API

其他输入设备

鼠标

  • 工作原理
    • 机械鼠标:通过底部的滚球带动滚轮转动,检测位移
    • 光电鼠标:通过LED发光照射桌面,光学传感器检测反射光的变化计算位移
    • 激光鼠标:用激光代替LED,分辨率更高,在更多表面上都能使用
  • 性能参数
    • DPI(Dots Per Inch):每英寸移动距离对应的像素点数,DPI越高鼠标越灵敏
    • 回报率:鼠标每秒向计算机汇报位置的次数,单位Hz,回报率越高越流畅,游戏鼠标通常是1000Hz
  • 按键事件:左键点击、右键点击、中键点击、滚轮滚动、侧键点击等

触摸板

  • 工作原理:电容式触摸,检测手指的电容变化来识别位置和移动
  • 支持手势:单指移动、双指滚动、双指缩放、三指切换窗口等
  • 现在笔记本电脑的触摸板体验已经非常好,很多场景下可以代替鼠标使用

触摸屏

  • 工作原理
    • 电阻式触摸屏:通过压力检测,精度高,但需要按压,不支持多点触控,现在已经很少用
    • 电容式触摸屏:通过检测手指的电容变化,支持多点触控,是现在手机、平板的主流技术
  • 触摸事件:触摸按下、触摸移动、触摸抬起、多点触摸等

其他输入设备

  • 扫描仪、数位板、麦克风、摄像头、游戏手柄、体感设备等,都是常见的输入设备,原理各不相同,但处理流程都是类似的:硬件检测输入,转换为数字信号,发送给操作系统,操作系统生成对应的输入事件,提供给应用程序处理。

输入事件处理的最佳实践

1. 响应速度优先

输入事件的响应速度直接影响用户体验,输入事件的处理要尽可能快,不要在输入事件回调中做耗时操作,避免卡顿。

  • 目标:键盘输入到屏幕显示的延迟要控制在100ms以内,超过这个时间用户就会感觉到明显的延迟
  • 游戏场景要求更高,通常要控制在50ms以内

2. 合理处理输入事件

  • 区分不同的事件类型,比如按键按下和字符输入是不同的事件,处理快捷键应该用按键按下事件,处理文本输入应该用字符输入事件
  • 支持键盘导航,所有功能都应该可以通过键盘操作,提升无障碍体验
  • 支持自定义快捷键,满足不同用户的使用习惯

3. 避免常见的坑

  • 不要拦截系统级的快捷键(比如Alt+F4、Ctrl+Alt+Del等),会让用户感到困惑
  • 处理好输入法的问题,中文输入法下不要触发快捷键
  • 支持按键重复,也支持取消重复(比如游戏中的射击按键)
  • 处理好触摸事件的冲突,比如滚动和点击的区分

思考问题

  1. 按下键盘上的A键,到屏幕上显示出字符“A“,中间经过了哪些处理流程?
  2. 机械键盘和薄膜键盘各有什么优缺点?你更喜欢用哪种?为什么?
  3. 为什么有时候同时按下多个按键会出现按键没反应的情况?怎么解决?
  4. 作为开发者,在处理用户输入的时候应该注意哪些问题来提升用户体验?