Множество разветвляющихся ожиданий клавиш в середине горячей клавиши

#loops #autohotkey

#циклы #автоотключение

Вопрос:

Я работаю в кабинете врача, выставляющего счета. Программы, созданные для этой работы, очень просты и абсолютно изобилуют ошибками, поэтому я часто повторяю части своего кода, чтобы убедиться, что они работают. Я использовал две программы, одну для выставления счетов, другую для диаграммы. Прямо сейчас моя горячая клавиша захватывает дату рождения и номер медицинской карты пациента со стороны выставления счетов, переходит на сторону диаграммы, выполняет поиск пациента на основе этих двух вещей (обычно MRN было бы достаточно, но Epic blows, поэтому этого недостаточно), выбирает пациента, нажимает «Просмотр диаграммы», затем ждет, пока я выберу дату обслуживания. При щелчке левой кнопкой мыши он возвращается в раздел выставления счетов, чтобы я мог скопировать в него информацию. проблема в том, что иногда пациент не появлялся, и я должен это записать. Если они не отображаются, нет диаграммы для щелчка, и я должен щелкнуть где-нибудь еще, чтобы дважды проверить, что они не отображаются. Мне нужен переходящий тип ожидания клавиш, где, если я нажимаю, он переходит на сторону выставления счетов, или, если я нажимаю A или что-то еще, он нажимает «встречи» и «мимо», затем возвращается к выставлению счетов и нажимает «Напечатанные заметки». Я могу управлять всем, кроме части ветвления. Операторы Getkeystate, похоже, не работают, и я не могу использовать оператор if с ожиданиями клавиш (по-видимому).

 !D::
BlockInput, MouseMoveOff
sleep 100
Winactivate, Hyperspace
sleep 100
sendinput ^w
sleep 300
winactivate, Form billing
sleep 300
BlockInput, MouseMove
mouseclick,, 400, 70
BlockInput, MouseMove
click
sleep 200
sendinput ^c
sleep 400
dob:=Clipboard
sleep 400
BlockInput, MouseMove
mouseclick,, 385, 85
BlockInput, MouseMove
click
sleep 200
sendinput ^c
WinActivate, Hyperspace
sleep 400
sendinput ^3
sleep 400
sendinput ^v
sleep 400
BlockInput, MouseMove
mouseclick,, 200, 145
sleep 400
Clipboard:=dob
sleep 400
StringTrimLeft, dobyear, dob, 6
sleep 50
dobmathd:=A_YYYY-dobyear
sleep 50
StringTrimRight, dobmo, dob, 8
sleep 50
StringTrimRight, dobd, dob, 5
sleep 50
StringTrimLeft, dobday, dobd, 3
sleep 50
if (dobmo >= A_MM) and (dobday >= A_DD)
{
dobmathd--
}
sleep 50
sendinput ^v
sleep 200
sendinput {Enter}
sleep 200
sendinput {Enter}
sleep 1700
BlockInput, MouseMove
mouseclick,, 85, 235
sleep 300
BlockInput, MouseMoveOff
;if (character = a)
;{
;BlockInput, MouseMove
;mouseclick,, 325, 40
;sleep 200
;mouseclick,, 60, 285
;click
;sleep 400
;mouseclick,, 240, 435
;sleep 2000
;winactivate, Form billing
;BlockInput, MouseMoveOff
;return
;}
;if (
tooltip,%dobmathd% Years old, 415, 70
keywait, LButton, D, T200
sleep 200
winactivate, Form billing
return
  

Прокомментированная часть была моей последней попыткой, но я некоторое время гуглил, чтобы найти реальную идею, которую можно попробовать. Любая помощь приветствуется!

Редактировать: Возможно, сработает оператор типа «если я нажму здесь, сделайте это, или если я нажму здесь, сделайте это». Я могу получить размеры окна просмотра диаграммы по сравнению с кнопкой на панели инструментов для назначений. Я экспериментировал с этим для другой задачи, но здесь это может сработать. Помощь в этом тоже была бы оценена!

Редактировать: @Bob, на самом деле, и извините за поздний ответ, я обнаружил, что цикл небольшого оператора с несколькими ожиданиями клавиш очень короткой длины хорошо работает для меня. Я вставлю свой код ниже. И это всего лишь фрагмент, так что это не полный код.

 SendInput, {Enter}
Sleep, 1800
BlockInput, MouseMove
MouseClick,, 85, 235
Sleep, 300
BlockInput, MouseMoveOff
Sleep, 20
Loop
{
    KeyWait, LButton, D, T0.02 ;I've picked a chart, meaning they showed up for their appointment
    If !ErrorLevel
    {
        Sleep, 400
        BlockInput, MouseMoveOff
        WinActivate, Form CMP
        Return
    }
    KeyWait, Escape, D, T0.02
    If !ErrorLevel
        Return
    KeyWait, ., D, T0.02 ;They do not appear to have shown up for their appointment, so check the appointment tab
    If !ErrorLevel
    {
        BlockInput, MouseMove
        MouseClick,, 315, 40
        Sleep, 400
        MouseClick,, 100, 285
        Sleep, 1000
        MouseClick,, 270, 440
        Sleep, 300
        BlockInput, MouseMoveOff
        Loop
        {
            KeyWait, Y, D, T0.02 ;They did not show up for their appointment. Bill appropriately.
            If !ErrorLevel
            {
                BlockInput, MouseMove
                WinActivate, Form CMP
                Sleep, 200
                MouseClick,, 210, 260
                Sleep, 200
                MouseClick,, 100, 400
                Sleep, 200
                SendInput, No Show
                Sleep, 200
                WinActivate, Hyperspace
                Sleep, 500
                MouseClick,, 85, 235
                Sleep 400
                WinActivate, Form CMP
                Sleep, 300
                BlockInput, MouseMoveOff
                Return
            }
            KeyWait, N, D, T0.02 ;Don't see a no show, re-check chart review.
            If !ErrorLevel
            {
                BlockInput, MouseMove
                MouseClick,, 85, 235
                Sleep, 500
                BlockInput, MouseMoveOff
                KeyWait, LButton, D
                Sleep, 400
                WinActivate, Form CMP
                BlockInput, MouseMoveOff                    
                Return
            }
            KeyWait, Escape, D, T0.02
            If !ErrorLevel
                Return
        }
    }
}
  

Комментарии:

1. И я думаю, что голосование по моему вопросу было немного суровым.

Ответ №1:

Я не могу использовать оператор if с ожиданиями клавиш

Существует способ «злоупотреблять» Input командой с помощью L1 и V (также может быть хорошей идеей добавить I ) опций, которые будут действовать как (несколько ограниченная) KeyWait замена. Это должно сработать для вашего варианта использования.

 (...)
Input,var,L1IV ; will act as KeyWait
if (var="a") {
    foo:=Round(Sqrt(1764))
    TrayTip,,The number is %foo%
}
else if (var="s")
  MsgBox Sssnaaakess 
(...)