ericwbailey/what-cant-i-press

GitHub: ericwbailey/what-cant-i-press

一款帮助开发者和设计师检测键盘快捷键冲突的桌面应用,通过扫描已打开的应用和内置屏幕阅读器快捷键数据库,避免新增快捷键时覆盖重要的辅助技术操作。

Stars: 40 | Forks: 0

An active gas stove burner, as seen from the top.

What Can't I Press?

macOS | Windows [应用使用示例。](https://github.com/user-attachments/assets/e829c947-c691-445c-b5b2-409be85851e4)

视频描述

在 macOS 上并排放置了两个打开的应用:TextEdit 和 What Can't I Press?。TextEdit 打开的是一个空白文档。What Can't I Press? 显示了一个搜索输入框、一个展开/折叠全部的切换按钮、4 个处于折叠状态的列表项、一条通知消息、一个快捷键筛选输入框、一个下载图标,以及两个分别标有“扫描所有打开的应用”和“扫描最后聚焦的应用”的按钮。这些列表项分别标有“JAWS”、“Narrator”、“NVDA”和“VoiceOver”,并且每个项都有一个徽章,用于统计现有的快捷键数量。

通知消息的内容为:“What Can't I Press 无法检测到所有可能的键盘快捷键。请务必也进行手动检查。”

鼠标光标点击“扫描最后聚焦的应用”按钮,随后进行了一次快速扫描。列表项更新并显示了全局键盘快捷键以及 TextEdit 的快捷键。所有列表项都变为展开状态,同时还显示了用于跳转到下一部分的链接。

接着,鼠标光标点击搜索输入框,并输入了单词“save”。然后简要滚动列表,以展示哪些应用具有与保存相关的功能。

通过点击清除按钮清空搜索输入框后,焦点被置于筛选输入框上,并输入了 Commandkbd> + s。键盘快捷键列表随即进行筛选,显示出所有包含这些按键的快捷键。

然后,光标点击 Command + S 保存行按钮,并将焦点置于 TextEdit 文档上。通过粘贴将内容“⌘S”插入到了文档中。

**帮助展示哪些键盘快捷键已经被不同的屏幕阅读器和应用占用**。这有助于在创建新快捷键时避免冲突。 例如,h 通常用于切换打开帮助对话框。而 h 也是[全球最受欢迎的两款屏幕阅读器中最常用的导航方式](https://webaim.org/projects/screenreadersurvey10/#finding)。 ## 如何使用 ### 打开应用 What Can’t I Press? 驻留在你的 macOS 菜单栏或 Windows 系统托盘中。点击其图标即可打开应用。在你首次启动它时,它也会自动显示。 ### 扫描以发现快捷键 - 检测在打开 What Can’t I Press? 之前你打开的应用中的快捷键,或者 - 扫描所有当前打开的应用。 ### 搜索与筛选 - **按意图搜索**。搜索键盘快捷键或命令以筛选列表。 - **按按键搜索**。输入键盘快捷键也可以进行筛选。  ### 复制以分享 - 点击某个键盘快捷键所在行即可将其复制到剪贴板。  - 按住 Control 点击可将其复制为 HTML 格式,其中每个按键都包裹在 `` 元素中,并使用完整的按键名称。 - 按住 Shift 点击可复制相同的 `` HTML 内容,但使用显示的符号。 ### 导出 可以为当前显示的键盘快捷键生成 JSON 格式数据。  ## 下载与安装 从[发布页面](https://github.com/ericwbailey/what-cant-i-press/releases/latest)下载最新的安装程序。  ### 权限 #### macOS 该应用使用 Accessibility API 进行扫描,这需要明确的权限。在首次运行扫描时,它会引导你启用此功能。 以下是手动启用它的方法: 1. 打开 **系统设置** → **隐私与安全性** → **辅助功能**。 2. 启用 **What Can't I Press**。 3. 重新打开应用并再次扫描。 如果应用已经被列出并启用,但扫描仍然提示需要 Accessibility 权限(这可能发生在安装更新之后),请使用 **–** 按钮移除 **What Can't I Press** 条目,重新添加该应用,将其启用,然后再重新打开并扫描。 完整的“扫描所有应用”过程会短暂地将每个正在运行的应用置于前台以读取其菜单,然后将焦点恢复到最初的位置。 #### Windows UI Automation 对于普通应用不需要预先授权。如果要从以管理员身份运行的应用中读取菜单加速键,则需要此应用同样以提升的权限运行。否则,这些应用将被静默跳过。 ## 隐私 ### 应用 该应用执行的所有工作均在设备本地进行。有关你扫描内容的任何信息都不会离开你的电脑。 该应用读取的键盘快捷键会在本地进行分析,并且只展示给你。不会收集、在设备外存储或发送到任何地方。 该应用没有遥测或分析功能。它唯一的网络活动是检查 GitHub 上的新版本以及打开链接(例如项目页面),且这些只能通过手动触发。 ### 网站 [配套网站使用](https://what-cant-i-press.app/) [Plausible Analytics](https://plausible.io/),这是一项注重隐私的轻量级分析服务。 ## 常见问题 ### 你为什么要开发这个工具? 手动发现冲突是一件繁琐的事情,但这又是一项重要的工作,可以确保你不会无意间覆盖掉重要的内容。这款应用有助于降低发现冲突的成本。 欲了解更多相关背景,请阅读[_一位无障碍设计师如何为 Web 应用添加键盘快捷键_](https://ericwbailey.website/published/how-an-accessibility-designer-adds-keyboard-shortcuts-to-a-web-app/)。 ### 关于屏幕阅读器的穿透键怎么办? 我们应尽可能不让使用辅助技术的人去承担使用变通方案的负担。 ### 如何提出功能建议? [提交一个描述该功能的 Issue](https://github.com/ericwbailey/what-cant-i-press/issues/new?template=feature_request.yml)。在此之前,请务必先[查看项目路线图](https://github.com/ericwbailey/what-cant-i-press/blob/main/ROADMAP.md)。 ### 如何报告 Bug? [提交一个描述该 Bug 的 Issue](https://github.com/ericwbailey/what-cant-i-press/issues/new?template=bug_report.yml)。 ### 如何报告识别错误的键盘快捷键? [提交一个描述未按预期工作的键盘快捷键的 Issue](https://github.com/ericwbailey/what-cant-i-press/issues/new?template=keyboard_shortcut_issue.yml)。 ### 如何报告无障碍问题? [提交一个描述访问障碍的 Issue](https://github.com/ericwbailey/what-cant-i-press/issues/new?template=accessibility_issue.yml)。 ### 你为什么使用 Electron 来开发这个应用? Electron 让我能够更轻松地跨不同操作系统分发该应用。与该领域的同类产品相比,它也是一个更为成熟的框架。 ### 为什么该应用无法检测到应用使用的每一个键盘快捷键? 声明键盘快捷键没有统一的标准注册表或技术。正因如此,有些键盘快捷键无法通过扫描检测到。这是由应用程序代码中编写键盘快捷键的方式决定的。 ### 为什么即使在授予了无障碍权限之后,该应用在 macOS 上仍然检测不到键盘快捷键? 这可能发生在 ad-hoc 签名的构建版本中,在我对其进行正式签名之前,该应用将一直使用这种签名方式。要解决此问题: - 进入 **系统设置** → **隐私与安全性** → **辅助功能** - 使用“–”移除“What Can't I Press” - 重新将该应用添加到应用列表中,然后将其启用。 ### 为什么键盘快捷键的检测在 Windows 上效果较差? 该应用的 Windows 版本使用 **Microsoft UI Automation (UIA)**(Windows 内置的无障碍框架)进行扫描。它会找到应用的菜单栏,并读取每个菜单项的 `AcceleratorKeyProperty`。 遗憾的是,UIA 并没有像 macOS 那样公开后台应用的加速键。在用户实际打开之前,“经典”的 Windows 32 时代菜单并不会出现在 UIA 树中。此外,诸如记事本、Office 和 Edge 等现代应用并不使用“经典”的菜单架构。 为了适应这一点,该应用会尽最大努力进行实时扫描,尝试通过 UIA 的 `ExpandCollapsePattern` 展开顶层菜单,并读取其能触及的所有内容。 [两款最受欢迎的桌面/笔记本电脑屏幕阅读器都在 Windows 上运行](https://webaim.org/projects/screenreadersurvey10/#primary)。如果你对微软在这类问题的可发现性上出现的倒退感到不满,可以考虑在他们的 issue 跟踪器上提出反馈。 ### 扫描是如何工作的? #### macOS - 通过一个小巧的内置 Swift 辅助程序列出正在运行的应用。 - 对于每个应用,使用 macOS Accessibility 服务读取其菜单栏,并提取每个菜单命令旁边显示的快捷键。 - 叠加在 **系统设置** → **键盘** → **键盘快捷键** → **App 快捷键** 中设置的所有自定义快捷键——包括特定应用和“所有应用程序”——这些设置会覆盖应用的默认值。 - 从 symbolic-hotkeys 首选项文件中读取内置的 macOS 系统快捷键,并将每个快捷键解码为按键、修饰键和纯英文标签。 - 标记在运行时注册了隐藏全局热键的应用。它们的二进制文件引入了 `RegisterEventHotKey`,这被视为覆盖盲区,因为这些热键是无法枚举的。 #### Windows - 通过查找具有可见主窗口的进程来列出正在运行的应用,并使用窗口标题作为其名称。 - 对于每个应用,使用 Windows UI Automation 遍历其菜单栏,并读取每个菜单项上列出的加速键。 - 如果未找到菜单栏,则退回到扫描整个窗口。 - 使用内置且手动维护的 Windows 系统快捷键列表(Win + ECtrl + Shift + EscAlt + Tab 等),因为 Windows 并未提供可以读取这些信息的存储库。 ### 你从哪里获取的屏幕阅读器键盘快捷键来源? - [JAWS](https://support.freedomscientific.com/Content/Documents/Manuals/JAWS/Keystrokes.txt) - [Narrator](https://support.microsoft.com/en-us/accessibility/windows/narrator/appendix-b-narrator-keyboard-commands-and-touch-gestures) - [NVDA](https://download.nvaccess.org/documentation/userGuide.html) - [Orca](https://gnome.pages.gitlab.gnome.org/orca/help/index.html) - [VoiceOver](https://support.apple.com/en-gb/guide/voiceover/vo14111/mac)
标签:快捷键, 数据可视化, 无障碍, 桌面应用, 系统工具, 自动化攻击, 辅助功能