Событие появления окна Autohotkey

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

Как создать событие при появлении указанного окна (#IfWinActive ahk_class ...)?

Также могу ли я привязать символ%? {%} не работает, вместо других.


person Roman Malieiev    schedule 07.02.2012    source источник
comment
Romale, А можно открыть windows spy при активном напоминании об отдыхе WorkRave? Вы открываете Windows Spy, щелкнув правой кнопкой мыши значок AHK. Window Spy всегда будет на высоте. Когда вы активируете экран WorkRave, вы должны увидеть детали (включая ahk_class). Я не знаю, что вы хотите сделать со знаком%.   -  person Robert Ilbrink    schedule 07.02.2012
comment
Romale, удачи тебе пока?   -  person Robert Ilbrink    schedule 08.02.2012
comment
1. Windows-шпион не может поймать первое предупреждение workrave о том, чтобы оставаться на вершине. Но я поймал это через список окон (ahk_class). Как привязать действие, когда оно появляется? 2. Пример, не работает: 5 :: {%}% :: {5}   -  person Roman Malieiev    schedule 09.02.2012


Ответы (2)


Чтобы получать мгновенное уведомление о появлении окна, используйте Shell Hook. Иногда это происходит так быстро, что autohotkey может среагировать еще до того, как вы сами увидите окно.

Перехватчик оболочки демонстрируется на форуме AutoHotkey.

Пример с вашим использованием (почти дословно скопировано из сообщения на форуме):

#Persistent
SetBatchLines, -1
Process, Priority,, High

Gui +LastFound
hWnd := WinExist()

DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return

ShellMessage( wParam,lParam )
{
    If ( wParam = 1 ) ;  HSHELL_WINDOWCREATED := 1
    {
        WinGetTitle, Title, ahk_id %lParam%
        If  ( Title = "WorkRest" )
            WinClose, ahk_id %lParam% ; close it immideately
    }
}

Если вы хотите использовать буквальный символ% в команде, экранируйте его с помощью escape-символа AutoHotkey, обратной кавычки `(на той же клавише, что и ~ на американской клавиатуре), например:

MsgBox You are 200`% awesome!
person infogulch    schedule 10.02.2012
comment
Это фантастика и отлично работает! Взгляните также на этот ответ. Можете ли вы разработать свой сценарий для этого? Т.е. обнаружить все существующие окна и посмотреть, были ли они ранее видны или нет? - person Vijay; 23.04.2014
comment
Это не работает, если за короткое время открываются два окна. У вас есть какое-то решение для этого? - person botenvouwer; 26.02.2020
comment
@botenvouwer, если вы пропустите события, вы, вероятно, слишком долго обрабатываете предыдущее событие. Ключ в том, что следующее ShellMessage не может выполняться, пока не завершится предыдущее, но ShellMessage может прервать другой код. Поэтому измените ShellMessage, чтобы добавить данные сообщения в глобальный объект очереди и немедленно вернуться, затем обработайте очередь сообщений в отдельном цикле / таймере, чтобы выполнять ваши команды window / gui / mouse / keyboard и т. Д., Которые являются относительно медленными. - person infogulch; 10.01.2021
comment
@Vijay Загляните в WinGet, List, чтобы вывести список окон. - person infogulch; 10.01.2021

Ромале,

Вы можете попробовать это, но поскольку я не использую WorkRave, я не могу его протестировать.

; This next line needs to be added at the top of the AHK file, so it will be started as soon as AHK starts.
; Every 120000 ms, it will launch the "WorkRave:" script to check if a window with WorkRave exists.
SetTimer, WorkRave,120000 ; Run WorkRaveTester every 2 minutes = 120000


; Somewhere else in the AHK file.....
WorkRave: ; This is the label for the WorkRave script
SetTitleMatchMode, 2 ; 2 = Matches the string WorkRave anywhere in the window title of IfWinExist
IfWinExist, WorkRave ; When WorkRave window exists
{
  TrayTip, WorkRave, Started ,1 ; Or whatever you want to do here....
}
Return
person Robert Ilbrink    schedule 10.02.2012