4

如何侦听OS X JavaScript中的事件以实现自动化?在OS X中附加事件侦听器JavaScript for Automation(JXA)

在消息应用程序的脚本库中,有一个事件处理程序列表,如messageSentmessageReceived。但是,我无法弄清楚如何使用它们。尝试传递函数会产生错误,并尝试将这些变量设置为新函数会导致REPL挂起。

什么是设置这些事件处理程序的正确方法?

回答

1

您将创建一个脚本,然后您可以从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) { 
} 
+0

也许我误解了你。你是说你不能运行app.say('hello')?因为你可以 – markhunte 2015-01-21 00:08:39

+0

不,你不能。您可以从'ScriptEditor'运行该函数,但试图在其中一个回调中使用'say()'会导致违反特权。 – chrissphinx 2015-04-07 01:18:50

1

我已经得到在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() {} 
+0

这应该更简单:'app = Application.currentApplication()','app.includeStandardAdditions = true','app.say(“hello”)' – Besi 2016-03-17 02:04:15

+0

应该是。是。但事实并非如此。特别是当你没有使用/ usr/bin/say程序时。 – 2016-03-17 15:41:14

+0

它的工作,当: 1.脚本文件具有格式** [文件名] .scpt **(创建脚本编辑器新文件) 2.选择的类型** **的JavaScript在'脚本Editor' 3.保存文件夹从'应用程序消息' - '菜单消息>首选项' - '一般部分' - 'AppleScript处理程序下拉菜单' - '打开脚本文件夹' 4.从第3页的AppleScript处理程序下拉菜单中选择此文件。 – 2016-03-22 05:11:08

相关问题