2

Mac 应用程序备忘单 ( http://www.cheatsheetapp.com/CheatSheet/ ) 或 keycue ( http://www.ergonis.com/products/keycue/ ) 具有收集活动应用程序的所有键盘快捷键的功能。我想知道我怎样才能实现这个功能。

4

1 回答 1

2

在 Mac 上,有几种不同的方法可以做到这一点,包括:

  • 枚举菜单和菜单项并从中读取击键。这又可以通过三种不同的方式完成:
    • 用户界面脚本。您可以通过 AppleScript、ScriptingBridge、appscript、F-Script 等与应用程序“系统事件”(在 AppleScript 编辑器中查看其字典,特别是 Processes Suite)进行对话。这样做的缺点是用户必须启用辅助功能访问这个工作。
    • 将您自己的代码插入每个应用程序并使用 NSMenu API。
    • 可以通过多种不同的方式将代码插入每个应用程序,但最好只编写一个SIMBL插件,这样您就不必自己弄清楚如何去做。
    • 从任何应用程序内部,如果它有一个 ObjC 运行时,您可以访问所有运行菜单栏的 Cocoa 类。在某些情况下,这甚至可以让您动态生成当前不存在但可能存在的菜单项。
    • 缺点是它不适用于 Carbon 应用程序,但每天剩下的应用程序更少。
    • 如果您对此感兴趣,请将 fscript注入应用程序并开始使用对象浏览器和脚本界面,您应该能够从那里弄清楚。然后,您可以将所学内容翻译成您选择的语言。
    • 将您自己的代码插入每个应用程序并使用 HIToolbox 中的 Carbon Menu Manager API。
    • 这些可以在 Carbon/Menus.h 中找到;它们更繁琐,未来也更渺茫,但目前它们将适用于 Carbon 和 Cocoa 应用程序。
  • 查看应用程序中嵌入的 NIB 文件。这很简单,但只处理从 NIB 创建的菜单。
  • 查看应用程序向操作系统注册的快捷方式。这也很简单,但在现代 OS X 中几乎没用,因为通常只有全局快捷方式会被注册。(如果您打开系统偏好设置的键盘面板,您可以看到那里有什么。)

在 Windows 上,我相信这涉及发送某种类型的 WM_* 消息,但您可能希望将其作为一个单独的问题(未标记 osx)而不是将其附加到这个问题上。

于 2012-07-10T18:16:36.343 回答