Как AutoHotKey постоянно отслеживать конкретное всплывающее окно и запускать скрипт, когда это всплывающее окно появляется

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

Я понимаю, что могу использовать цикл, который запускает проверку окна каждые 500 мс, а затем выполняет сценарий, если окно присутствует, но я думаю, что должен быть НЕКОТОРЫЙ способ, при котором AHK может непрерывно контролировать, не находясь в коротком временном цикле. Любой прошлый опыт приветствуется! Спасибо!

P.S. Я изучил тег #persistent, но не думаю, что он действительно подходит для того, что я ищу.

Дополнительное примечание: я продолжил свое собственное исследование и нашел WinWait, но он не работает, когда появляется всплывающее окно! Вы можете сообщить мне, что я делаю не так? Вот сценарий, который я добавил в свой файл AHK:

WinWaitActive, Message, Number of Kits,0
{
    Send {Enter}
}
Return

А вот снимок из Инспектора Windows:

>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
Message
ahk_class TMessForm

>>>>>>>>>>>>( Mouse Position )<<<<<<<<<<<<<
On Screen:  1219, 438  (less often used)
In Active Window:   765, 7

>>>>>>>>>( Now Under Mouse Cursor )<<<<<<<<

Color:  0xF7F3F7  (Blue=F7 Green=F3 Red=F7)

>>>>>>>>>>( Active Window Position )<<<<<<<<<<
left: 454     top: 431     width: 491     height: 148

>>>>>>>>>>>( Status Bar Text )<<<<<<<<<<

>>>>>>>>>>>( Visible Window Text )<<<<<<<<<<<
&Ok
1
Number of Kits

>>>>>>>>>>>( Hidden Window Text )<<<<<<<<<<<

>>>>( TitleMatchMode=slow Visible Text )<<<<

>>>>( TitleMatchMode=slow Hidden Text )<<<<

person theAliasOfAlias    schedule 29.07.2013    source источник
comment
Я бы рекомендовал использовать WinWait или ShellHook. У последнего есть положительная сторона, позволяющая реализовать реализацию, управляемую событиями. Другими словами, процесс может полностью остановиться или сделать что-то еще, ожидая окна. На мой взгляд, даже цикл ожидания подойдет, если вашему скрипту больше нечего делать. Если вам нужно быстрое решение, я предлагаю использовать WinWait.   -  person MCL    schedule 29.07.2013
comment
Спасибо, моя мысль основана на моем независимом исследовании, но что-то не так с моей реализацией. Я добавил фрагменты кода выше. Можешь взглянуть и помочь мне? Спасибо!   -  person theAliasOfAlias    schedule 29.07.2013
comment
Ознакомьтесь с документами. Вы используете тайм-аут 0, что означает, что он будет ждать 0,5 секунды. Другими словами, он отправит ввод почти сразу, независимо от того, какое окно активно.   -  person MCL    schedule 29.07.2013
comment
Интересно, а вы рекомендуете подождать как минимум секунду? Цель заключалась в том, чтобы поле очищалось сразу же, как только оно становится активным, чтобы не прерывать и не задерживать процесс сканирования в торговой точке. Так вы думаете, что это проблема, а не то, что я реализовал ее неправильно?   -  person theAliasOfAlias    schedule 29.07.2013
comment
Рекомендую подождать бесконечно. Почему всего одну секунду, или 10, или 1000?   -  person MCL    schedule 29.07.2013
comment
Ага, я должен оставить это поле пустым. Я думал, что ожидание требовалось для ожидания после того, как окно выскочило, а затем для выполнения сценария. Я попробую.   -  person theAliasOfAlias    schedule 29.07.2013
comment
Нет, это все еще не так. Можете ли вы помочь мне или порекомендовать кого-нибудь, кого вы, возможно, знаете, который может предоставить отладку моей реализации WaitWinActive?   -  person theAliasOfAlias    schedule 29.07.2013
comment
Просто поиграйте немного. 1. Используйте MsgBox, чтобы проверить, обнаруживается ли окно 2. Используйте WinWait вместо WinWaitActive 3. Используйте WinClose или ControlClick вместо Send   -  person MCL    schedule 30.07.2013
comment
Чуть не забыл: попробуйте включить DetectHiddenWindows   -  person MCL    schedule 30.07.2013


Ответы (2)


Я боролся с несколькими всплывающими окнами с таймером, который запускается каждую секунду в течение многих лет. Если это не сработает сразу, вам просто нужно изменить IfWinExist в соответствии с вашим окном.

SetTimer, CheckWin, 1000
return


CheckWin:
SetTitleMatchMode, 2
IfWinExist, ahk_class TMessForm, Number of Kits
{
   WinClose 

   ; alternatively, write code to activate window
   ; then send Enter as in your example

   TrayTip, Popup-Killer,Window killed,3, 17
   return
}
return

Кстати, мне очень нравится идея MCL Shell Hook из комментариев ...

person 576i    schedule 30.07.2013
comment
Одним из немногих недостатков метода shellhook является то, что он получает сообщения только об окнах верхнего уровня. - person blackholyman; 30.07.2013
comment
Blackholyman, ваш вклад был очень полезен на форуме AHK - пожалуйста, посмотрите здесь решение, которое сработало для меня, и всем спасибо за вашу помощь! autohotkey.com/board/topic/ - person theAliasOfAlias; 31.07.2013
comment
Для будущих разработчиков я также наткнулся на эту маленькую жемчужину: autohotkey.com/board/topic/ - person theAliasOfAlias; 11.08.2013

как насчет этого?:

F12:: 
  WINDOWEXPLORER: 
    WinWaitActive, Windows Explorer,, 0.01 
    if ErrorLevel { 
      Goto WINDOWEXPLORER 
    } else { 
      ; SoundBeep 4500, 30
      Return 
    }
person Raf431    schedule 04.09.2015