4.2 键盘与输入设备
输入设备是我们向计算机输入信息的接口,键盘、鼠标、触摸板、触摸屏等都是最常见的输入设备。理解输入设备的工作原理,有助于我们更好地处理用户输入,优化交互体验。
键盘的工作原理
键盘是最常用的输入设备,我们每天都在使用,但你知道按下一个按键到屏幕上显示出字符,中间经过了多少处理流程吗?
键盘的分类
1. 薄膜键盘
- 结构:上下两层导电薄膜,中间有绝缘层,按键按下时两层薄膜接触,电路导通
- 优点:成本低、噪音小、寿命长(一般1000万次敲击寿命)
- 缺点:手感差,没有段落感,按键冲突较多
- 适用场景:普通办公、日常使用
2. 机械键盘
- 结构:每个按键都是一个独立的机械轴,常见的轴有青轴、红轴、茶轴、黑轴等
- 优点:手感好,有段落感,按键冲突少,寿命长(一般5000万次敲击寿命)
- 缺点:成本高、噪音大(青轴)
- 适用场景:游戏、程序员、对输入手感有要求的用户
3. 静电容键盘
- 结构:利用电容容量变化来检测按键按下,不需要物理接触
- 优点:手感顺滑,寿命极长(1亿次以上敲击寿命),噪音小
- 缺点:价格昂贵
- 适用场景:高端用户、专业打字员
键盘的工作流程
当你按下一个按键时,键盘内部的微控制器会检测到按键按下,然后向计算机发送对应的扫描码(Scan Code):
- 按键检测:键盘的微控制器周期性扫描按键矩阵,检测哪个按键被按下或释放
- 生成扫描码:根据按下的按键,生成对应的扫描码,按下按键发送通码(Make Code),释放按键发送断码(Break Code)
- 发送到主机:通过USB/PS2接口将扫描码发送给计算机的键盘控制器
- 操作系统处理:操作系统的键盘驱动收到扫描码,转换为对应的虚拟键码(Virtual Key Code),然后生成键盘事件放入系统消息队列
- 应用程序处理:应用程序从消息队列中获取键盘事件,做出对应的处理(比如输入字符、触发快捷键等)
扫描码与键码
扫描码(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等) → 发送到对应线程的消息队列 → 应用程序从消息队列取出消息 → 处理事件
常见的键盘事件
- 按键按下事件(Key Down):按键被按下时触发
- 按键释放事件(Key Up):按键被释放时触发
- 字符输入事件(Char / Key Press):按键按下后产生可输入字符时触发
开发中的常见问题
- 输入法冲突:处理快捷键的时候要注意输入法状态,比如中文输入法下的按键和英文输入法下可能不同
- 重复按键:按键按住不放会连续触发按键事件,可以通过系统设置调整重复延迟和重复速度
- 组合键处理:处理Ctrl、Shift、Alt等修饰键的组合,需要检测修饰键的状态
- 全局快捷键:注册系统级的全局快捷键,需要调用操作系统的API
其他输入设备
鼠标
- 工作原理:
- 机械鼠标:通过底部的滚球带动滚轮转动,检测位移
- 光电鼠标:通过LED发光照射桌面,光学传感器检测反射光的变化计算位移
- 激光鼠标:用激光代替LED,分辨率更高,在更多表面上都能使用
- 性能参数:
- DPI(Dots Per Inch):每英寸移动距离对应的像素点数,DPI越高鼠标越灵敏
- 回报率:鼠标每秒向计算机汇报位置的次数,单位Hz,回报率越高越流畅,游戏鼠标通常是1000Hz
- 按键事件:左键点击、右键点击、中键点击、滚轮滚动、侧键点击等
触摸板
- 工作原理:电容式触摸,检测手指的电容变化来识别位置和移动
- 支持手势:单指移动、双指滚动、双指缩放、三指切换窗口等
- 现在笔记本电脑的触摸板体验已经非常好,很多场景下可以代替鼠标使用
触摸屏
- 工作原理:
- 电阻式触摸屏:通过压力检测,精度高,但需要按压,不支持多点触控,现在已经很少用
- 电容式触摸屏:通过检测手指的电容变化,支持多点触控,是现在手机、平板的主流技术
- 触摸事件:触摸按下、触摸移动、触摸抬起、多点触摸等
其他输入设备
- 扫描仪、数位板、麦克风、摄像头、游戏手柄、体感设备等,都是常见的输入设备,原理各不相同,但处理流程都是类似的:硬件检测输入,转换为数字信号,发送给操作系统,操作系统生成对应的输入事件,提供给应用程序处理。
输入事件处理的最佳实践
1. 响应速度优先
输入事件的响应速度直接影响用户体验,输入事件的处理要尽可能快,不要在输入事件回调中做耗时操作,避免卡顿。
- 目标:键盘输入到屏幕显示的延迟要控制在100ms以内,超过这个时间用户就会感觉到明显的延迟
- 游戏场景要求更高,通常要控制在50ms以内
2. 合理处理输入事件
- 区分不同的事件类型,比如按键按下和字符输入是不同的事件,处理快捷键应该用按键按下事件,处理文本输入应该用字符输入事件
- 支持键盘导航,所有功能都应该可以通过键盘操作,提升无障碍体验
- 支持自定义快捷键,满足不同用户的使用习惯
3. 避免常见的坑
- 不要拦截系统级的快捷键(比如Alt+F4、Ctrl+Alt+Del等),会让用户感到困惑
- 处理好输入法的问题,中文输入法下不要触发快捷键
- 支持按键重复,也支持取消重复(比如游戏中的射击按键)
- 处理好触摸事件的冲突,比如滚动和点击的区分
思考问题
- 按下键盘上的A键,到屏幕上显示出字符“A“,中间经过了哪些处理流程?
- 机械键盘和薄膜键盘各有什么优缺点?你更喜欢用哪种?为什么?
- 为什么有时候同时按下多个按键会出现按键没反应的情况?怎么解决?
- 作为开发者,在处理用户输入的时候应该注意哪些问题来提升用户体验?