Запустить скрипт (AppleScript или JXA) на.app работает?

У меня есть небольшая компьютерная лаборатория, в которой студенты могут пользоваться без присмотра, с подключенным к сети принтером. Я пытаюсь реализовать простое диалоговое окно оповещения о дополнениях сценариев со всеми правилами о принтере, которые мне нужно вспомнить, когда они выбирают печать из любого числа различных приложений.

Я пытаюсь прикрепить скрипт непосредственно к самому принтеру в каталоге User/Library/Printer, (xxx.xxx.xxx.xxx.app), чтобы любой браузер или программа просмотра PDF и т. Д. Отображали сообщение при попытке запустить принтер.

Я пытался использовать automator с applecript, я пытался переименовать принтер и называть яблочный скрипт именем принтера, но пока ничего хорошего.

Что мне не хватает?

1 ответ

Решение

В этом ответе я покажу, как создать апплет JavaScript для автоматизации (JXA), который прослушивает уведомления о запуске приложения и заставке-остановке экрана, а затем отображает предупреждение при его получении, что приводит к желаемому результату, описанному в вопросе. Я также описываю, как этот подход может быть адаптирован для запуска сценария AppleScript, который приведет к конкретному поведению, описанному в заголовке вопроса.

инструкции

  1. Откройте приложение Script Editor и создайте новый документ
  2. Во всплывающем окне в верхнем левом углу окна выберите JavaScript вместо AppleScript
  3. Вставьте код, указанный ниже
  4. Сохраните скрипт как апплет, изменив "Формат файла" на "Приложение" на панели сохранения и включив опцию "Оставаться открытым после обработчика запуска".
  5. Запустите апплет, выбрав "Запустить приложение" в меню "Скрипт"
  6. Запустите приложение и обратите внимание на предупреждение
  7. Запустите, а затем остановите заставку и обратите внимание на предупреждение

Код

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)

обсуждение

Сначала код апплета создает новый класс с именем "MainController", который реализует два метода: "appDidLaunch:" и "screensaverDidStop:". Эти методы реализованы для использования функциональности "отображение оповещения" из стандартных дополнений.

Затем код апплета создает экземпляр объекта этого класса и регистрирует этот экземпляр в качестве наблюдателя уведомлений, которые публикуются при запуске приложений и при остановке хранителя экрана.

Апплет продолжает работать после выполнения кода JXA, и когда происходят события, вызываются функции JXA.

Следующие шаги

Если вы хотите запустить скрипт AppleScript из JXA, вы можете обратиться к ответу на этот вопрос.

Если вы хотите усложнить случайный выход из апплета, вы можете сделать апплет "элементом пользовательского интерфейса", установив для ключа LSUIElement значение "true" в Info.plist апплета.

Наконец, вы можете добавить апплет к элементам входа пользователя, чтобы он автоматически запускался после перезагрузки.

Другие вопросы по тегам