Спосіб 1: SystemUIServer
Після годин пошуку в Інтернеті та тестування різних рішень я знайшов один спосіб підтримувати працюючий AppleScript поверх усіх вікон. Метод наданий у публікації №2 цієї теми MacScripter.net .
Ось код:
tell application "SystemUIServer"
activate
end tell
Я розмістив весь свій код AppleScript в межах вищезгаданого tell
твердження. Це прекрасно працювало на першому діалоговому вікні, але, на жаль, це спричинило помилку незабаром після проходження через AppleScript.
Що я повинен був зробити, це вручну інкапсулювати кожне діалогове вікно у власну tell
заяву. Для кожного примірника:
choose from list
display alert
display dialog
Мені довелося додати заяву. У мене є незліченна кількість діалогів, вбудованих у відповідний AppleScript, тому для завершення цього знадобилося кілька годин.
Отже, це не велика відповідь, оскільки це потенційно дуже трудомістке. В ідеалі можна було б вставити оператор SystemUIServer лише один раз у свій код і зробити це з ним.
Примітка про час очікування за замовчуванням:
Якщо ви інкапсулюєте діалогове вікно в межах вищезгаданого блоку повідомлень, за замовчуванням сценарій закінчується, якщо користувач не натисне кнопку протягом 2 хвилин. Якщо цей час закінчиться, сценарій буде скасовано. Користувачеві буде надана така помилка:
У SystemUIServer з’явилася помилка: AppleEvent вичерпано.
(Як не дивно, навіть якщо користувач закриє це діалогове вікно помилок, початкове діалогове вікно залишатиметься закріпленим вгорі, поки користувач не натисне кнопку в діалоговому вікні.)
Ось відповідний опис документації AppleScript для with timeout
:
Якщо команда не може виконати відведений час (будь то за замовчуванням дві хвилини, або час, встановлений with timeout
випискою), AppleScript припиняє запуск сценарію та повертає помилку "event timed out"
. AppleScript не скасовує операцію - вона просто зупиняє виконання сценарію. Якщо ви хочете, щоб сценарій продовжувався, ви можете загортати висловлювання у спробу. Однак, чи може ваш скрипт надіслати команду для скасування тривалої операції з порушенням часу після закінчення тайм-ауту, залежить від програми, яка виконує цю команду.
Отже, якщо ви не хочете, щоб час очікування впливав на діалоги, виконайте наступне:
tell application "SystemUIServer"
with timeout of 999999 seconds
activate
display dialog "Hello World"
end timeout
end tell
Примітка про діалоги введення:
Спосіб 1 не працює належним чином із display dialog
текстом, у якому є текстове поле (тобто default answer ""
).
Хоча діалогове вікно зберігається поверх усіх інших вікон, якщо користувач натисне будь-де за межами діалогового вікна, користувач не зможе вводити текст у текстове поле. Миготливий текстовий курсор назавжди зникне.
Верхня панель діалогового вікна одразу стає білою, коли користувач натискає діалогове вікно. Неможливо отримати смужку повернення до темно-сірого кольору (який відображає передній план / активний стан), щоб текст міг бути набраний.
Користувач все одно зможе натискати будь-які кнопки в діалоговому вікні, але головна функція діалогового вікна, тобто отримання тексту від користувача, буде серйозно заважати.
Коротше кажучи, я не рекомендую включати діалогові введення в SystemUIServer
блок передачі.
Спосіб 2. Додаток FastScripts
Ще одним способом збереження кожного діалогового вікна файлу AppleScript, закріпленого поверх усіх інших вікон, є використання сторонньої програми під назвою FastScripts для запуску файлів скриптів. FastScripts зберігає всі діалогові вікна за замовчуванням, що дуже корисно. Я навіть не знаю, чи можна цю функцію відключити (якщо ви хотіли її вимкнути; я цього не роблю).
FastScripts може запустити .scpt файл за допомогою спеціальної комбінації клавіш або вручну (просто натисніть на піктограму FastScripts на панелі меню, щоб представити випадаючий список ваших сценаріїв).
(Я знаю, що коли я задав це питання спочатку, я вказав, що AppleScript був збережений у вигляді .app-файлу. Але, файл AppleScript .app може бути легко та за короткий час перетворений у файл AppleScript .scpt.)
Звичайно, цей метод є привабливим, оскільки не потрібно редагувати один біт свого коду AppleScript, щоб бажаний ефект був реалізований. FastScripts робить всю важку роботу.