如何侦听OS X JavaScript中的事件以实现自动化?在OS X中附加事件侦听器JavaScript for Automation(JXA)
在消息应用程序的脚本库中,有一个事件处理程序列表,如messageSent
和messageReceived
。但是,我无法弄清楚如何使用它们。尝试传递函数会产生错误,并尝试将这些变量设置为新函数会导致REPL挂起。
什么是设置这些事件处理程序的正确方法?
如何侦听OS X JavaScript中的事件以实现自动化?在OS X中附加事件侦听器JavaScript for Automation(JXA)
在消息应用程序的脚本库中,有一个事件处理程序列表,如messageSent
和messageReceived
。但是,我无法弄清楚如何使用它们。尝试传递函数会产生错误,并尝试将这些变量设置为新函数会导致REPL挂起。
什么是设置这些事件处理程序的正确方法?
您将创建一个脚本,然后您可以从Preferences > General
的AppleScript处理程序菜单中选择该脚本。使用内置的Speak Events.applescript
文件作为您的指南,并注意您必须重写每个处理程序才能正确执行。
注:甚至用加标在内,你仍然不能因为他们是如何实现的脚本引擎之上这一层,使得使用currentApplication()
看起来好像连一个合适的呼叫呼叫像say()
可能脚本除了命令它正在被发送交叉应用程序。
这里是一个模板:
Messages = Application.currentApplication()
Messages.includeStandardAdditions = true
function messageSent(m, e) {
}
function messageReceived(m, e) {
}
function chatRoomMessageReceived(e) {
}
function activeChatMessageReceived(m, e) {
}
function addressedMessageReceived(m, b, c, e) {
}
function receivedTextInvitation(e) {
}
function receivedAudioInvitation(m, b, c, e) {
}
function receivedVideoInvitation(m, b, c, e) {
}
function receivedLocalScreenSharingInvitation(b, c, e) {
}
function buddyAuthorizationRequested(e) {
}
function addressedChatRoomMessageReceived(e) {
}
function receivedRemoteScreenSharingInvitation(e) {
}
function loginFinished(e) {
}
function logoutFinished(e) {
}
function buddyBecameAvailable(e) {
}
function buddyBecameUnavailable(e) {
}
function receivedFileTransferInvitation(e) {
}
function avChatStarted(e) {
}
function avChatEnded(e) {
}
function completedFileTransfer(e) {
}
我已经得到说在OS X 10.11.3测试版(15D9c)工作。
ObjC.import('stdlib')
var yell = "say"
function run() {
// messageReceived("test",{from:Application("Messages").services.byName("SMS").buddies[0]})
}
function execute(program, args) {
var command = program + " " + args.map(q).join("")
console.log(command)
$.system(command)
function q(s) {
return " '" + s.replace("'", "'\\''") + "' "
}
}
function messageReceived(text, who) {
execute(yell, [who.from.name(), text])
}
function loginFinished(service) {
execute(yell, ["login", service.for.name()])
}
function logoutFinished(service) { // doesn't work!
execute(yell, ["Logout", service.for.name()])
}
function keys(o) { // debugging tool
return Object.keys(o).join(",")
}
receivedTextInvitation = addressedMessageReceived = chatRoomMessageReceived = activeChatMessageReceived = messageReceived
function messageSent() {}
function receivedAudioInvitation() {}
function receivedVideoInvitation() {}
function receivedLocalScreenSharingInvitation() {}
function buddyAuthorizationRequested() {}
function addressedChatRoomMessageReceived() {}
function receivedRemoteScreenSharingInvitation() {}
function logoutFinished() {}
function buddyBecameAvailable() {}
function buddyBecameUnavailable() {}
function receivedFileTransferInvitation() {}
function avChatStarted() {}
function avChatEnded() {}
function completedFileTransfer() {}
这应该更简单:'app = Application.currentApplication()','app.includeStandardAdditions = true','app.say(“hello”)' – Besi 2016-03-17 02:04:15
应该是。是。但事实并非如此。特别是当你没有使用/ usr/bin/say程序时。 – 2016-03-17 15:41:14
它的工作,当: 1.脚本文件具有格式** [文件名] .scpt **(创建脚本编辑器新文件) 2.选择的类型** **的JavaScript在'脚本Editor' 3.保存文件夹从'应用程序消息' - '菜单消息>首选项' - '一般部分' - 'AppleScript处理程序下拉菜单' - '打开脚本文件夹' 4.从第3页的AppleScript处理程序下拉菜单中选择此文件。 – 2016-03-22 05:11:08
也许我误解了你。你是说你不能运行app.say('hello')?因为你可以 – markhunte 2015-01-21 00:08:39
不,你不能。您可以从'ScriptEditor'运行该函数,但试图在其中一个回调中使用'say()'会导致违反特权。 – chrissphinx 2015-04-07 01:18:50