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

Бессонный хакатон: нажатие на кнопку

Продолжаю писать про свой бессонный хакатон.

В решении, которое я накидал за ту ночь, планировалось нажимать на кнопки эмулятора «ЭплСкриптом» — на «Маке» это логичнее всего, так как этот язык заточен как раз под такие задачи — автоматизацию работы со сторонними графическими приложениями.

Удивительно, но у меня это сделать не получилось — несмотря на то, что я слал кнопки как описано в документации, в эмуляторе ничего не происходило.

Так как время уходило, — сроку я себе выделил до утра, пришлось использовать другое решение — через утилиту cliclick, которая умеет эмулировать нажатие мышкой:

cliclick m:800,630 w:200 c:. w:200 m:+100,+100

Я просто закодировал координаты нужной кнопки в том месте, где у меня она была на экране. Одна проблема — кнопка после нажатия «залипала», но я решил тем, что через 200 миллисекунд отводил курсор в сторону — w:200 m:+100,+100 на птичьем языке утилиты.

Уже позже, во время рефакторинга, я обратил внимание, что когда я нажимаю кнопку на своём ноутбуке, то в эмуляторе иногда нажимаются не одна кнопка, а две. Если жать стрелки вниз или вверх, то в эмуляторе происходит нажатие на CS+6 и на CS+7 соответственно, причём оболочка электронного журнала правильно реагирует и на эту комбинацию, и на одиночные «6» и «7».

Для эксперимента попробовал слать вместе с основной клавишей ещё и клавишу-модификатор и меня ждал успех, правда пришлось перебрать их все. Получилась вот такая функция:

function press_key {
    local key
    if [[ "$1" =~ ^[0-9]{2,}$ ]]; then
        key="key code $1"
    else
        key="keystroke \"$1\""
    fi

    osascript <<PRESS
tell application "System Events" to $key using command down
delay .03
tell application "System Events" to $key
PRESS
}

Она определяет что ей передали — код символа или сам символ и «нажимает» запрошенную клавишу. Второй раз я «нажимаю» ту же клавишу уже без модификатора, иначе она почему-то опять же «залипает» на виртуальной клавиатуре.