Як підтримувати додаток поверх усіх вікон за допомогою AppleScript?


3

У мене є AppleScript .app файл, який в основному складається з серії діалогів.

Я хотів би тримати цю програму над усіма іншими вікнами (в тому числі і над будь-якими новими вікнами, які створюються під час роботи програми), поки AppleScript не завершиться і програма автоматично не закриється.

Чи можна закріпити вікно вгорі в AppleScript?

Відповіді:


1

Спосіб 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 робить всю важку роботу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.