在.app上运行脚本(AppleScript或JXA)?

时间:2018-03-26 23:04:42

标签: printing applescript alertdialog jxa lab

我有一个小型计算机实验室,供学生使用相当无人监督,并在网络上连接打印机。我正在尝试实现一个简单的脚本添加警报对话框,其中包含有关打印机的所有规则,当我们从任意数量的不同应用程序中选择打印时,我需要弹出这些规则。

我正在尝试将脚本直接附加到用户/库/打印机目录(xxx.xxx.xxx.xxx.app)中的打印机本身,因此任何浏览器或pdf查看器等都会显示消息当他们试图运行打印机时。

我尝试过使用带有AppleScript的automator,我尝试重命名打印机并将applecript称为打印机的名称,到目前为止还不错。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

在这个答案中,我将展示如何创建一个JavaScript for Automation(JXA)applet,它监听app-launch和screensaver-stop通知,然后在收到通知时显示警告,从而产生问题中描述的所需结果。我还描述了如何调整这种方法来触发AppleScript脚本,这将产生问题标题中描述的特定行为。

说明

  1. 打开脚本编辑器应用并创建新文档
  2. 从窗口左上角附近的弹出窗口中选择JavaScript而不是AppleScript
  3. 粘贴下面提供的代码
  4. 通过在“保存”面板中将“文件格式”更改为“应用程序”并启用“保持打开后运行处理程序”选项,将脚本另存为小程序。
  5. 从“脚本”菜单中选择“运行应用程序”
  6. 运行applet
  7. 启动应用并发出提醒
  8. 启动然后停止屏幕保护程序并注意警告
  9. 代码

    var me = Application.currentApplication(); me.includeStandardAdditions = true
    
    ObjC.import('Cocoa')
    
    ObjC.registerSubclass({
      name: 'MainController',
      methods: {
        'appDidLaunch:': {
          types: ['void', ['id']],
          implementation: function(notification) {
            var appName = notification.userInfo.objectForKey('NSApplicationName').js
            me.activate()
            me.displayAlert(`Hello, ${appName}!`, {message: 'Nice to meet you.'})
            Application(appName).activate()
          }
        },
        'screensaverDidStop:': {
          types: ['void', ['id']],
          implementation: function(notification) {
            me.activate()
            me.displayAlert('Goodbye, screensaver!', {message: 'It was nice knowing you.'})
          }
        }
      }
    })
    
    var controller = $.MainController.new
    
    $.NSWorkspace.sharedWorkspace.notificationCenter.addObserverSelectorNameObject(controller, 'appDidLaunch:', $.NSWorkspaceDidLaunchApplicationNotification, undefined)
    
    $.NSDistributedNotificationCenter.defaultCenter.addObserverSelectorNameObject(controller, 'screensaverDidStop:', 'com.apple.screensaver.didstop', undefined)
    

    讨论

    首先,applet代码创建一个名为“MainController”的新类,它实现了两个方法,'appDidLaunch:'和'screensaverDidStop:'。实现这些方法是为了使用Standard Additions中的“显示警报”功能。

    接下来,applet代码实例化此类的对象,并将该实例注册为启动应用程序时以及屏幕保护程序停止时发布的通知的观察者。

    在JXA代码执行后,applet继续运行,当事件发生时,将调用JXA函数。

    后续步骤

    如果您想从JXA运行AppleScript脚本,可以参考this question的答案。

    如果您想让意外退出applet变得更加困难,可以通过在applet的Info.plist中将LSUIElement键设置为“true”来使applet成为“UI元素”。

    最后,您可能希望将applet添加到用户的登录项中,以便在重新启动后自动启动。