【问题标题】:Attach event listeners in OS X JavaScript for Automation (JXA)在 OS X JavaScript for Automation (JXA) 中附加事件侦听器
【发布时间】:2015-01-19 03:58:09
【问题描述】:

如何在 OS X JavaScript 中侦听事件以实现自动化。

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

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

【问题讨论】:

    标签: javascript macos automation applescript javascript-automation


    【解决方案1】:

    您将创建一个脚本,然后从Preferences > General 中的AppleScript 处理程序菜单中选择该脚本。使用内置的 Speak Events.applescript 文件作为您的指南,并注意您必须覆盖每个处理程序才能正确执行。

    注意:即使包含标准添加,您仍然无法调用像 say() 这样的脚本添加命令,这可能是因为他们如何在脚本引擎之上实现这一层,甚至使一个适当的使用currentApplication() 调用看起来好像是跨应用程序发送的。

    这是一个模板:

    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) {
    }
    

    【讨论】:

    • 也许我误解了你。你是说你不能运行 app.say('hello') 吗?因为你可以
    • 不,你不能。您可以从 ScriptEditor 运行该函数,但尝试在其中一个回调中使用 say() 将导致权限冲突。
    【解决方案2】:

    我已经在 OS X 10.11.3 Beta (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")
    • 应该是。是的。但事实并非如此。尤其是当您实际上并未使用 /usr/bin/say 程序时。
    • 它起作用了,当: 1. 脚本文件具有格式 [fileName].scpt (在脚本编辑器中创建新文件) 2. 选择类型 JavaScriptScript Editor 3. 从application Messages - menu Messages > Preferences - General Section - AppleScript handler dropdown menu - Open Scripts Folder 4. 在文件夹中保存文件 AppleScript handler dropdown menu 从第 3 页选择此文件。
    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多