是否可以将密钥代码发送到不在前面的应用程序?
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 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);
我正在 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 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);