;Нужные инклуды
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <HotKey.au3>
#include <vkConstants.au3>
;Глобальные константы
Global Const $TICK = 1 ;время сна карусели в мс
Global Const $WINDOW = 0
Global Const $CONTROL = 1
Global Const $TIME = 2
Global Const $PAUSE_TIME = 3
;Глобальные переменные
Global $Pause = 0
Global $Quit = 0
Global $PauseData[4]
;Обработчики нажатий на клавиатуру
_HotKey_Assign($VK_PAUSE, 'TogglePause') ;Перехватчик кнопки Pause Break
;HotKeySet('{PAUSE}', 'TogglePause') ;Перехватчик кнопки Pause Break
_HotKey_Assign(BitOR($CK_CONTROL, $VK_Q), 'ToggleQuit') ;Перехватчик Ctrl+Q выхода
;Пауза
Func Pause()
Switch $Pause
Case 1 ;поддерживаем паузу
If TimerDiff($PauseData[$TIME]) > 290000 Then ;прошло 4 минуты 50 секунд
$PauseData[$PAUSE_TIME] += 5 ;время на паузе
TrayTip('На паузе', 'уже '& $PauseData[$PAUSE_TIME] &' минут', 20, 1)
ControlFocus($PauseData[$WINDOW], '', $PauseData[$CONTROL]) ;Возвращаем фокус
ControlSend($PauseData[$WINDOW], '', $PauseData[$CONTROL], '{PAUSE}{TAB}{TAB down}{PAUSE}')
$PauseData[$TIME] = TimerInit() ;считаем время снова
EndIf
Case 2 ;снимаем с паузы
WinActivate($PauseData[$WINDOW]) ;!!! НА ЭТОЙ СТРОКЕ ГЛЮЧИТ !!!
ControlFocus($PauseData[$WINDOW], '', $PauseData[$CONTROL]) ;Возвращаем фокус
ControlSend($PauseData[$WINDOW], '', $PauseData[$CONTROL], '{PAUSE}{TAB}')
$Pause = 3 ;в ожидании активизации
Case 3 ;ждем активации окна
If WinActive($PauseData[$WINDOW]) Then ;если окно активное, то
$Pause = 0 ;готовы снова поставить на паузу
EndIf
EndSwitch
EndFunc
;Завершение работы
Func Terminate()
If $Quit > 0 Then ;пора выходить?
If TimerDiff($Quit) > 5000 Then ;прошло 5 секунд
Exit ;выходим
EndIf
EndIf
EndFunc
;;;; Тушка проги ;;;;
TrayTip('Прога запущена','Нажми "Pause Break" для включения паузы,'& @LF &'"Ctrl+Q" для завершения работы', 30, 1)
;Основной микроцикл карусели фукнций с временем тика 1мс
While 1
;карусель функций
Pause()
Terminate()
;опрос меню
Sleep($TICK)
WEnd
;;;;;;;;
;Обработчик нажатия на "Pause"
Func TogglePause()
If $Quit = 0 Then ;процедура выхода не запущена?
Switch $Pause ;в зависимости от состояния паузы
Case 0 ;не были на паузе
$Pause = 1 ;теперь на паузе
TrayTip('Окно поставлено на паузу', 'Сделай себе кофейку', 20, 1)
$PauseData[$WINDOW] = WinGetHandle('[active]') ;запоминаем окно
$PauseData[$CONTROL] = ControlGetFocus($PauseData[$WINDOW]) ;запоминаем активный элемент
$PauseData[$TIME] = TimerInit() ;засекаем время
$PauseData[$PAUSE_TIME] = 0 ;а тут время на паузе
ControlSend($PauseData[$WINDOW], '', $PauseData[$CONTROL], '{TAB down}{PAUSE}')
Case 1 ;были на паузе
$Pause = 2 ;снимаем с паузы
TrayTip('Пауза', 'снята', 20, 1)
Case Else
TrayTip('Пауза', 'снята', 20, 1)
EndSwitch
EndIf
EndFunc
;Обработчик нажатия на "Ctrl+Q"
Func ToggleQuit()
If $Quit = 0 Then ;процедура выхода не запущена?
TrayTip('Завершаем работу', 'До новых встреч!', 5 ,1)
If $Pause = 1 Then ;Если были на паузе, то завершаем паузу
$Pause = 2
EndIf
$Quit = TimerInit()
EndIf
EndFunc