我们知道,个人计算机最早的输入方式是CLI命令行,GUI和鼠标是后来的事。然而,键盘终归是理论效率更高的交互方式。人们为双手不用离开键盘来干鼠标的事情做出过不少产品设计,比如小红点。那么,软件上有哪些实现方式呢?

操作页面元素

访问键

微软的推荐设计规范的内容。 微软的learn文档

一般表现为单击alt时主菜单控件(有时包括子控件)的名称旁大写字母出现下划线,按下对应键即可触发控件。一般alt+字母快捷键也有效。

一般同时会有方向键导航,即左右切换主菜单选中,上下切换子菜单选中,左右收起展开菜单等。

不过用法多样(不够规范),比如有时候单击alt后才出现字母,比如有的字母是悬浮在控件上的

来自百度百科

FluentSearch

这个全功能搜索软件致力于……搜索

屏幕搜索会给屏幕上的控件设置字母快捷键

它另外还有个应用内搜索,实用性欠佳,不过配合讲述人模式做无障碍设计倒是挺好的。

无障碍设计

对于Web无障碍设计来说,完备的无鼠标操作也是很重要的一部分。

国内前些年无障碍设计被提上日程,也有了些规范文档,比如无障碍说明_上海市人民政府规定了快捷键的设计。

另外,通过语音操作控件也经常附带在语音播报器/屏幕阅读器里,尤其是移动端。更远的还有其他创新交互方式,就和本文无关了,这里不再赘述。无障碍设计是个很大的话题。

模拟鼠标

模拟鼠标的移动、点击等行为

Windows的“使鼠标更易于使用”

官方支持链接

将数字小键盘改为鼠标键。

AutoHotKey

这么通用又简单的方式,不写个小脚本怎么行。

还原前文的数字键模拟鼠标键:

; 设置基本移动速度,加速和减速倍数
baseSpeed := 10
acceleration := 3
deceleration := 0.5

; 当按下数字键时,实现光标移动
0::MoveCursor(0, baseSpeed)
1::MoveCursor(-baseSpeed, baseSpeed)
2::MoveCursor(0, baseSpeed)
3::MoveCursor(baseSpeed, baseSpeed)
4::MoveCursor(-baseSpeed, 0)
6::MoveCursor(baseSpeed, 0)
7::MoveCursor(-baseSpeed, -baseSpeed)
8::MoveCursor(0, -baseSpeed)
9::MoveCursor(baseSpeed, -baseSpeed)

; 当按下 Ctrl + 数字键时,实现加速光标移动
^0::MoveCursor(0, baseSpeed * acceleration)
^1::MoveCursor(-baseSpeed * acceleration, baseSpeed * acceleration)
^2::MoveCursor(0, baseSpeed * acceleration)
^3::MoveCursor(baseSpeed * acceleration, baseSpeed * acceleration)
^4::MoveCursor(-baseSpeed * acceleration, 0)
^6::MoveCursor(baseSpeed * acceleration, 0)
^7::MoveCursor(-baseSpeed * acceleration, -baseSpeed * acceleration)
^8::MoveCursor(0, -baseSpeed * acceleration)
^9::MoveCursor(baseSpeed * acceleration, -baseSpeed * acceleration)

; 当按下 Shift + 数字键时,实现减速光标移动
+0::MoveCursor(0, baseSpeed * deceleration)
+1::MoveCursor(-baseSpeed * deceleration, baseSpeed * deceleration)
+2::MoveCursor(0, baseSpeed * deceleration)
+3::MoveCursor(baseSpeed * deceleration, baseSpeed * deceleration)
+4::MoveCursor(-baseSpeed * deceleration, 0)
+6::MoveCursor(baseSpeed * deceleration, 0)
+7::MoveCursor(-baseSpeed * deceleration, -baseSpeed * deceleration)
+8::MoveCursor(0, -baseSpeed * deceleration)
+9::MoveCursor(baseSpeed * deceleration, -baseSpeed * deceleration)

; 移动光标的函数
MoveCursor(x, y) {
    MouseMove, x, y, 0, R
    return
}

由于我把笔记本键盘禁用了懒得再启用,没法(虽然可以改)测试数字小键盘,不过应该直接在每行数字前面加个"Numpad"就行。

方向键版本:

; 设置每次按键移动的像素值
pixelAmount := 10
largePixelAmount := 200

; 当按下 Alt+方向键 时,实现光标在屏幕上按像素移动
!Left::
  MouseMove, -%pixelAmount%, 0, 0, R
  return

!Right::
  MouseMove, %pixelAmount%, 0, 0, R
  return

!Up::
  MouseMove, 0, -%pixelAmount%, 0, R
  return

!Down::
  MouseMove, 0, %pixelAmount%, 0, R
  return

; 当按下 Ctrl+Alt+方向键 时,实现光标在屏幕上移动200个像素
^!Left::
  MouseMove, -%largePixelAmount%, 0, 0, R
  return

^!Right::
  MouseMove, %largePixelAmount%, 0, 0, R
  return

^!Up::
  MouseMove, 0, -%largePixelAmount%, 0, R
  return

^!Down::
  MouseMove, 0, %largePixelAmount%, 0, R
  return

Quicker

要在quicker实现上面这种,要么动作写成持续运行在后面循环监听,要么快捷键里每个都设置一下,这不能接受。相对的,我只设置了键盘代替左右键单击:Ctrl+"[“和”]“分别模拟左右键单击,Capslock因为需要拦截原本的大小写功能,单纯快捷键不能实现,得先设置常用辅助功能-按键映射。

动作里了

当然了,ahk写起来也很简单,只是懒得用。