macOS периодически отправляет нажатие клавиш активному приложению - PullRequest
2 голосов
/ 17 февраля 2020

Я пытаюсь отправить нажатие клавиши (command + shift + r) в приложение macOS (Mojave) под названием «Dbeaver» каждую минуту , пока DBeaver является активным приложением. Я пробовал следующее без эффекта.

tell application "System Events"
    set activeApp to name of first application process whose frontmost is true
    if "DBeaver" is in activeApp then
        tell application "System Events" to keystroke "r" using {command down, shift down}

    end if
end tell

Сценарий работает отлично, если его просто, как показано ниже:

activate application "DBeaver" 
tell application "System Events" to keystroke "r" using {command down, shift down}

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы хотите избегать использования чего-то вроде repeat l oop, так как это заблокирует пользовательский интерфейс приложения (для выхода или просто для того, чтобы избежать вращающегося колеса смерти). Относительно простой способ повторить подобные вещи - создать приложение, оставшееся открытым, и поместить свой повторяющийся код в обработчик idle, который использует таймер, например:

on idle
    tell application "System Events"
        set activeApp to name of first application process whose frontmost is true
        if "DBeaver" is in activeApp then
            tell application "System Events" to keystroke "r" using {command down, shift down}
        end if
    end tell
    return 60 -- do it again in 60 seconds
end

. обработчик idle запускается, когда приложение бездействует; возвращаемое значение определяет количество секунд до повторного запуска обработчика.

1 голос
/ 18 февраля 2020

У меня нет приложения, на которое вы ссылались, но я протестировал следующий AppleScript-код с помощью TextEdit.app, и он заработал. Дайте мне знать, если у вас возникнут какие-либо ошибки или проблемы

tell application "System Events"
    repeat while (exists of application process "DBeaver")
        set activeApp to name of first application process whose frontmost is true
        if "DBeaver" is in activeApp then
            tell its application process "DBeaver"
                repeat while frontmost
                    keystroke "r" using {command down, shift down}
                    delay 60
                end repeat
            end tell
        end if
    end repeat
end tell
...