Мой скрипт avc_control.ahk, запускаемый при старте системы
Выполняемые скриптом задачи:
1. Иногда при выходе из спящего режима RR не запускает автоматически WinAmp на воспроизведение. Подозреваю, что это связано с задержками, вызванными моим решением проблемы долгой инициализации звуковой usb-карты - перезапуском WinAmp'а. Скрипт avc_control.ahk отслеживает перезапуск WinAmp'а и посылает ему команду на начало воспроизведения.
2. Как показало расследование, в моём компе есть некий глюк то ли программный - в дровах, то ли аппаратный - в материнке... Но так или иначе случаются проблемы с зависанием компа после выходы из спящего режима. Эти проблемы, как мне кажется, решены (описано чуть выше). Однако, редко, но после выхода из спящего режима случается проблема вылета по ошибке какой-то службы Windows. Причём, только тогда, когда запущен и работает СитиГид... Как выяснилось, вылетает служба Windows Audio. Забавно, но WinAmp при этом продолжает нормально работать. Скрипт avc_control.ahk обрабатывает эту ситуацию - скидывает окно сообщения об ошибке и перезапускает службу Windows Audio.
3. В случае не планируемой перезагрузки компа (например, по кнопке питания или через reset) PowerStrip выкидывает окно с вопросом о восстановлении. На нём надо всего лишь нажать "Да", с чем успешно справляется утилитка от
kolychev'а, но зачем запускать кучу прог, когда всё можно сделать силами того же скрипта avc_control.ahk?
4. Обработка клавиатурных комбинаций, приходящих при нажатии штатных кнопок на консоли от avc_usb.exe - управление WinAmp'ом, снятие скриншота и передача горячих клавиш в PowerStrip для управлением гаммой "день/ночь" и показом/скрытием мышки.
5. Имитация нажатия правой кнопки мышки
Чтобы RR не путал WinAmp и KMPlayer, WinAmp через настройки RR запускается с идентификатором класса RRWinamp.
Код:
#NoTrayIcon ; не отображать значок скрипта в трее
#SingleInstance force ; перезагрузить скрипт, если он уже запущен
DetectHiddenWindows, On ; искать в скрытых окнах
#NoEnv ; запрещаем имена переменных как у переменных окружения
SendMode Input ; ускоренный ввод
WinAmpActive := 0 ; первоначально считаем, что WinAmp не запущен
day := 1 ; гамма в положении "день"
; Вечный цикл обработки ситуаций
Loop
{
If WinAmpActive = 0
{
IfWinExist, ahk_class RRWinamp
{
; WinAmp не был запущен, а сейчас найден в списке окон
Sleep 2000 ; подождать 2 секунды пока WinAmp запускается
PostMessage, 0x111, 40045,,, ahk_class RRWinamp ; включить воспроизведение
WinAmpActive := 1 ; считаем WinAmp запущенным
}
}
Else
{
IfWinNotExist, ahk_class RRWinamp
{
; Считали WinAmp запущенным, а сейчас не видим в списке окон
WinAmpActive := 0 ; считаем WinAmp не запущенным
}
}
IfWinExist, Меры предосторожности
{
; Найдено стартовое окно восстановления PowerStrip'а
WinActivate
Send, Д ; нажимаем кнопку "Да"
}
IfWinExist, svchost.exe - Ошибка приложения
{
; Скидываем полученную ошибку приложения (вероятнее всего служба Windows Audio)
WinActivate
Send, {Esc} ; посылаем нажатие клавиши Escape - нажатие кнопки Cancel на форме
Run, nircmd service restart AudioSrv,, Hide ; перезапускаем службу Windows Audio
}
Sleep 1000 ; спим 1 секунду и повторяем проверки
}
; Транслируем нажатие кнопки на консоли в горячую клавиатурную комбинацию
; для PowerStrip'а - включение/выключение режима скрытия указателя мышки
^!+c::^!5
^!+b::RButton ; имитация правой кнопки мышки
^!+a:: ; делаем screenshot всего экрана
RunWait, nircmd savescreenshot C:\PrScr.png,, Hide
FileGetTime, OutputVar, C:\PrScr.png, C
FileMove C:\PrScr.png, C:\Scrns\ss_%OutputVar%.png
return
^!+e:: ; переключаемся на следующий трек
PostMessage, 0x111, 40048,,, ahk_class RRWinamp ; следующий трек
return
^!+f:: ; переключаемся на предыдущий трек
PostMessage, 0x111, 40044,,, ahk_class RRWinamp ; предыдущий трек
return
^!+h:: ; кнопка воспроизведение/пауза
SendMessage, 0x400,, 104,, ahk_class RRWinamp ; проверка воспроизведения
If ErrorLevel = 0 ; если не воспроизводится, то...
PostMessage, 0x111, 40045,,, ahk_class RRWinamp ; включить воспроизведение
Else ; если воспроизводится, то...
PostMessage, 0x111, 40046,,, ahk_class RRWinamp ; поставить на паузу
return
^!+i:: ; переключение гаммы "день/ночь" - посылаем комбинации в PowerStrip
If(!day)
{
Send, ^!1 ; посылаем в PowerStrip - "включить дневной профиль"
day := 1
}
Else
{
Send, ^!2 ; посылаем в PowerStrip - "включить ночной профиль"
day := 0
}
return