是否可以将密钥代码发送到不在前面的应用程序?

Is it possible to send a key code to an application that is not in front?

我正在 Javascript.

中编写一个简单的 Automator 脚本

我想发送一个键码(或 key-storke)到不在前面的 OS X 应用程序。

基本上,我想 运行 此代码并在脚本打开某个应用程序时执行我的操作,编写文本,然后按回车键 - 所有这些都不会打扰我的其他工作。

我想要这样的东西: Application("System Events").processes['someApp'].windows[0].textFields[0].keyCode(76);

脚本词典中,Processes Suite下有keyCode方法。 但是,上面的代码会引发以下错误: execution error: Error on line 16: Error: Named parameters must be passed as an object. (-2700)

我知道下面的代码可以正常工作,但它要求应用程序在前面 运行ning: // KeyCode 76 => "Enter" Application("System Events").keyCode(76);

更新:我正在尝试在 iTunes(Apple Music) 上搜索一些内容。如果不预先安装 iTunes 应用程序,这可能吗?

借助 GUI 脚本可访问性), 但是:

  • 您需要知道您特定的 window 中有哪些 UI 元素 应用程序,并知道的属性和属性 特定元素。
  • 您需要在 System Preferences --> Security & Privacy --> Accessibility 中添加您的脚本。

这里有一个示例脚本(在 macOS Sierra 上测试过)用于在“TextEdit[=”的前面文档中的光标位置写入一些文本37=]" 应用程序。

Application("System Events").processes['TextEdit'].windows[0].scrollAreas[0].textAreas[0].attributes["AXSelectedText"].value = "some text" + "\r" // r is the return KEY

更新

要将一些关键代码发送到后台应用程序,您可以使用 Carbon 框架的 CGEventPostToPid() 方法。

这是在 iTunes 中搜索一些文本的脚本(适用于我的电脑,macOS SierraiTunes 版本 10.6.2)。

ObjC.import('Carbon')
iPid = Application("System Events").processes['iTunes'].unixId()
searchField = Application("System Events").processes['iTunes'].windows[0].textFields[0]
searchField.buttons[0].actions['AXPress'].perform()
delay(0.1) // increase it, if no search 
searchField.focused = true
delay(0.3) // increase it, if no search 
searchField.value = "world" // the searching text
searchField.actions["AXConfirm"].perform()
delay(0.1) // increase it, if no search 

// ** carbon methods to send the enter key to a background application ***
enterDown = $.CGEventCreateKeyboardEvent($(), 76, true);
enterUp = $.CGEventCreateKeyboardEvent($(), 76, false);
$.CGEventPostToPid(iPid, enterDown);
delay(0.1)
$.CGEventPostToPid(iPid, enterUp);