Сценарий для ввода текста в поле

Вот небольшой скрипт, который вводит текст в документ при активации.

tell application "TextEdit"
  activate
end tell
delay 0.2
tell application "System Events"
  keystroke "Hello World!"
  keystroke return
end tell

Я запустил delay там, потому что в противном случае первые несколько нажатий клавиш имеют тенденцию запускаться до того, как окно будет активировано, поэтому я получаю «lo World!». в документе и «Хеле» в любом другом окне было сосредоточено, когда скрипт был активирован. Это правильное использование delay, или есть лучший способ обойти эту проблему?

29 голосов | спросил hairboat 18 ThuEurope/Moscow2014-12-18T01:00:06+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 01:00:06 +0300 2014, 01:00:06

2 ответа


10

Вместо того, чтобы использовать системные события для генерации нажатий клавиш, рассмотрите возможность использования TextEdit для вставки текста.

tell application "TextEdit"
    activate
    tell first document to set its text to its text & "Hello World!\n"
end tell

Есть разница, однако: эта версия всегда добавляет «Hello World!» на end документа, а не везде, где находится курсор. (К сожалению, в AppleScript-словаре TextEdit ничего не говорится о курсорах.)

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

ответил 200_success 18 ThuEurope/Moscow2014-12-18T20:23:43+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 20:23:43 +0300 2014, 20:23:43
7

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

Этот сценарий охватывает все сценарии, о которых я могу думать:

 tell application "System Events"        
    -- In case TextEdit was already running and all windows were closed
    repeat until first window of application "TextEdit" exists
        tell application "TextEdit" to make new document at the front
        delay 0.001
    end repeat

    -- Ensure TextEdit can have focus
    repeat until process "TextEdit" is frontmost
        set frontmost of process "TextEdit" to true
        delay 0.001
    end repeat

    -- Give focus to the window
    set focused of first window of process "TextEdit" to true

    keystroke "Hello world\n"
end tell

В частности, сценарии, которые я тестировал, включают:

  • TextEdit не запускался вообще
  • TextEdit запущен, но не имел окон документов вообще
  • TextEdit уже работает с одним или несколькими окнами

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

Однако нет никакой гарантии, что пользователь не намеренно пытается вызвать состояние гонки во время отправки нажатия клавиш.

ответил 200_success 21 SunEurope/Moscow2014-12-21T01:03:36+03:00Europe/Moscow12bEurope/MoscowSun, 21 Dec 2014 01:03:36 +0300 2014, 01:03:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132