#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
(...)