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

时间:2017-09-08 01:06:34

标签: javascript macos applescript automator

我正在用Javascript编写一个简单的Automator脚本。

我想将密钥代码(或密钥存储)发送到不在前面的OS X应用程序。

基本上,我想运行这段代码并在脚本打开某个应用程序,写入文本和点击输入时执行所有操作 - 所有这些都不会影响我的其他工作。

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

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

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

更新:我正在尝试在iTunes(Apple Music)上搜索某些内容。如果没有预先提供iTunes应用程序,这可能吗?

1 个答案:

答案 0 :(得分:1)

可以在 GUI脚本辅助功能)的帮助下在应用程序中编写文本,但是:

  • 您需要知道特定窗口中的UI元素 应用程序,并了解其属性和属性 具体要素。
  • 您需要在System Preferences --> Security & Privacy --> Accessibility
  • 中添加脚本

这是一个示例脚本(在 macOS Sierra 上测试),可以在“ TextEdit ”应用程序的前端文档中的光标位置写入一些文本。

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 Sierra iTunes版本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);