我有一个小型计算机实验室,供学生使用相当无人监督,并在网络上连接打印机。我正在尝试实现一个简单的脚本添加警报对话框,其中包含有关打印机的所有规则,当我们从任意数量的不同应用程序中选择打印时,我需要弹出这些规则。
我正在尝试将脚本直接附加到用户/库/打印机目录(xxx.xxx.xxx.xxx.app)中的打印机本身,因此任何浏览器或pdf查看器等都会显示消息当他们试图运行打印机时。
我尝试过使用带有AppleScript的automator,我尝试重命名打印机并将applecript称为打印机的名称,到目前为止还不错。
我错过了什么?
答案 0 :(得分:1)
在这个答案中,我将展示如何创建一个JavaScript for Automation(JXA)applet,它监听app-launch和screensaver-stop通知,然后在收到通知时显示警告,从而产生问题中描述的所需结果。我还描述了如何调整这种方法来触发AppleScript脚本,这将产生问题标题中描述的特定行为。
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添加到用户的登录项中,以便在重新启动后自动启动。