2016-01-06 3 views
0

Мой код выполняет следующие действия:Скрыть GUI, когда целевое окно не активно или свернуто

  • Когда окно google.com становится активным, он покажет вам простой графический интерфейс.

  • Затем, если вы перейдете на другую вкладку, GUI будет скрыт. [1]

[1]. Обратите внимание, что он работает также и для вкладок, открытых в другом окне браузера. Например, вы можете открыть 2 окна браузера - первое окно с google.com и apple.com, а второе окно - amazon.com. Вы можете щелкнуть вкладку apple.com, а также вкладку amazon.com, и в обоих случаях GUI будет скрыт. Затем, если вы нажмете вкладку google.com, графический интерфейс снова появится.

Проблема заключается в том, что я не могу понять, как заставить GUI быть скрытым, когда окно (содержащее вкладку google.com) сведено к минимуму. (И также, я не могу избавиться от чувства, что есть другие ошибки, которые не видны во время тестирования, но на самом деле существуют).

Суммируя все это, что я хочу это:

Как только окно без Google или вкладки нажата/включена (за исключением AHK Gui) Графический интерфейс пользователя должен быть скрыт, и как только как любой щелчок/вкладка google-окна/вкладки активируется, Gui должен быть показан.

Вот мой код:

#Persistent 
SetTimer, Show_Gui, 300 
Return 

Show_Gui: 
IfWinNotActive, foo 
IfWinNotActive, Google 
{ 
    Gui, Destroy 
    Return 
} 
; Otherwise: 
SetTimer, Show_Gui, Off 
Gui, Add, Button, w200 h25 gTest1, button 1 
Gui, Add, Button, w200 h25 gTest2, button 2 
Gui, Show,, foo 
WinWaitNotActive, foo 
WinWaitNotActive, Google 
SetTimer, Show_Gui, On 
Return 

Test1: 
; do something 
Return 

Test2: 
; do something 
Return 

Edit. Вот код, который обсуждался в комментариях к сообщению Forivin. Это не часть актуального вопроса.

#Persistent 

Gui, Add, Button, w200 h25 gTest1, button 1 
Gui, Add, Button, w200 h25 gTest2, button 2 

GroupAdd, myGroup, Google 
GroupAdd, myGroup, foo 

WinWaitActive, Google 
Gui, Show,, foo 
SetTimer, Gui_Visibility_Handler, 300 
Return 

Gui_Visibility_Handler: 
    WinGet, googleWinState, MinMax, Google 
    If (googleWinState = -1 || !WinExist("Google")) ;if window minimized or not existent 
    { 
     Gui, Hide 
     If (googleWinState = -1) ;workaround for a bug where windows thinks 
      Send, !{Esc}   ;that the minimized window is active 
     WinWaitActive, Google 
     Gui, Show 
     Return 
    } 
    IfWinActive, Google 
    { 
     Gui, Show 
     Return 
    } 
    IfWinNotActive, ahk_group MyGroup 
    { 
     Gui, Hide 
     Return 
    } 
Return 

Test1: 
;do something 
Return 

Test2: 
;do something 
Return 

ответ

1

EDIT: Вот новый код, как описано в комментариях:

#Persistent 

Gui, Add, Button, w200 h25 gTest1, button 1 
Gui, Add, Button, w200 h25 gTest2, button 2 
Gui, +hwndAhkGui 

lastActive := WinExist("A") 

SetTimer, Active_Window_Memory 
SetTimer, Gui_Visibility_Handler, 300 

Return 

Gui_Visibility_Handler: 
    WinGet, googleWinState, MinMax, Google 
    If (googleWinState != -1 && IsGoogleWindow(currentActive)) ;if google is not minimized and: (google is active or: (ahk gui is active and google was active before that)) 
    { 
     Gui, Show 
    } 
    Else If (currentActive = AhkGui && IsGoogleWindow(lastActive)) 
    { 
     ;No need to do anything 
    } 
    Else 
    { 
     Gui, Hide 
    } 
Return 

IsGoogleWindow(hWnd) { 
    WinGetTitle, title, ahk_id %hWnd% 
    If (InStr(title, " - Google Chrome")) 
    { 
     title := RegExReplace(title, " - Google Chrome$", "") ;remove the " - Google Chrome" from the title 
    } 

    If (InStr(title, "Google")) 
    { 
     Return True 
    } 

    Return False 
} 

Active_Window_Memory: 
    currentActive := WinExist("A") 
    WinWaitNotActive, ahk_id %currentActive% 
    lastActive := currentActive 
Return 

Test1: 
; do something 
Return 

Test2: 
; do something 
Return 
+0

Спасибо, он работает хорошо, за исключением того, что он не скрывает GUI, когда я нажимаю вкладку в другом окне браузера. Я создал изображение с 4 скриншотами, чтобы объяснить: http: // imgur.com/vfPSbqL –

+0

Хорошо, позвольте мне попытаться суммировать то, что я понимаю: как только клик или вкладка без google или вкладка (за исключением AHK Gui) вы хотите, чтобы Gui был скрыт, и как только любое окно google/tab нажата/активирована, вы хотите показать Gui. Это верно? – Forivin

+0

Да, это именно то, что я хочу. –

1
#Persistent 
SetTitleMatchMode, 2 

GroupAdd, Amazon_Apple_Group, Amazon.com ahk_exe firefox.exe 
GroupAdd, Amazon_Apple_Group, Amazon.com ahk_exe chrome.exe 
GroupAdd, Amazon_Apple_Group, Apple - Mozilla Firefox ahk_exe firefox.exe 
GroupAdd, Amazon_Apple_Group, Apple - Google Chrome ahk_exe chrome.exe 

Gui, Add, Button, w200 h25 gTest1, button 1 
Gui, Add, Button, w200 h25 gTest2, button 2 
SetTimer, Show_Gui, 300 
Return 


Show_Gui: 
IfWinActive, ahk_group Amazon_Apple_Group 
{ 
SetTimer, Show_Gui, Off 
Gui, Show, NoActivate, foo 
WinSet, AlwaysOnTop, On, foo ahk_class AutoHotkeyGUI 
WinWaitNotActive, ahk_group Amazon_Apple_Group 
Sleep, 50 
Gui, Cancel 
SetTimer, Show_Gui, On 
} 
Return 


Test1: 
Gui, Submit 
; do sth 
Return 

Test2: 
Gui, Submit 
; do sth 
return 

https://autohotkey.com/docs/commands/GroupAdd.htm

«Если таймер отключается во время ее подпрограммы в настоящее время работает , эта подпрограмма будет продолжаться до тех пор, пока она не завершится ». https://autohotkey.com/docs/commands/SetTimer.htm#Remarks

"SetTimer, Show_Gui, Off" не выключает таймер выключения до следующей подпрограммы

Gui, Show, NoActivate, foo 
WinSet, AlwaysOnTop, On, foo ahk_class AutoHotkeyGUI 
WinWaitNotActive, ahk_group Amazon_Apple_Group 
Sleep, 50 
Gui, Cancel 
SetTimer, Show_Gui, On 

Завершает.

Подпрограмма автоматически включает таймер после завершения.

+0

Я проверил ваш ответ позже, но это тоже очень хорошо, спасибо. Можете ли вы объяснить, почему нам нужно установить «SetTimer, Show_Gui, Off» и «SetTimer, Show_Gui, On'? –

+0

См. Комментарии добавленные. – user3419297

+0

Спасибо, я прочитал документы SetTimer. Может быть, я был недостаточно ясен, извините. Я спросил, почему нам нужно «SetTimer» Off и On, в то время как скрипт работает хорошо, даже если мы удалим эти две строки? По моему непрофессиональному взгляду эти две строки кажутся излишними. –