С вашей помощью
С вашей помощью
Последняя версия, с которой сейчас езжу
avc_control.ahk:
Код:#NoTrayIcon ; не отображать значок скрипта в трее #SingleInstance force ; перезагрузить скрипт, если он уже запущен DetectHiddenWindows, On ; искать в скрытых окнах #NoEnv ; запрещаем имена переменных как у переменных окружения SendMode Input ; ускорренный ввод #Persistent ; держать скрипт запущенным SetTitleMatchMode 2 ; 2 - заголовок окна должен содержать значение, заданное в параметре ; ----------- редактируемые переменные - настройки ------------ winampid := "RRWinamp" ; идентификатор класса окна винампа cityguide := "City Guide" ; название окна CityGuide myconnection := "BluetoothConnection" ; название подключения к Инету btadapter := "Jabra - A320s" ; название адаптера bluetooth pinghost1 := "193.125.152.104" ; кого мучаем пингами в первую очередь (www.relcom.ru) pinghost2 := "194.87.0.50" ; кого мучаем пингами во вторую очередь (www.ru) onlinestr := "В сети" ; сообщение "Online" на экране (переменная RR OnlineStatus) offlinestr := "---" ; сообщение "Offline" на экране chkonline := "+ +" ; сообщение "постоянное подключение" на экране pstripwin := "Меры предосторожности" ; название стартового окна восстановления PowerStrip'а svhostwin := "svchost.exe - Ошибка приложения" ; название окна ошибки службы (вероятнее всего служба Windows Audio) winamperror := "NullSoft DirectSound output" ; название окна винампа с ошибкой звукового устройства checkperiod := 30 ; через сколько секунд (примерно) запускаем процедуру проверки сети и пробок СитиГида myjamfile := "C:\Program Files\City Guide\78SPb.jam" ; за каким файлом пробок следим (боевой) ;myjamfile := "C:\CityGuide\City Guide 2.2\78SPb.jam" ; за каким файлом пробок следим (тестовый) jamgreen := 8 ; до скольки минут считать возраст пробок зеленым jamred := 50 ; до скольки минут считать возраст пробок красным empty := "нет" ; что пишем на экране, если пробочный файл очень старый camgrabbererror := "CamGraber full error" ; ошибка camgrabber'а kmperror := "KMPlayer error in file" ; ошибка kmplayer'а karaoke := "vanBasco's Karaoke Player" ; название окна karaoke player'а ; -------- конец редактируемых переменных - настроек ---------- WinAmpActive := 0 KaraokeActive := 0 CityGuideActive := 0 day := 1 online := 0 setoffline := 0 oncheckonline := 0 Lastcheck := 0 checkperiod := - checkperiod * 1000 jamexpired := 1 ; Создаем пустое окно и сразу его прячем. Окно необходимо для получения команд управления от RR Gui, Show WinWait, avc_control.ahk ;WinSet, ExStyle, ^0x80 WinHide, avc_control.ahk ; Устанавливаем обработчик для приёма команд через WM_COPYDATA от RR OnMessage(0x4A, "OnCopyData") SetTimer, CheckWarnings, 2000 SetTimer, CheckJam, 30000 SetTimer, CheckInternet, %checkperiod%, -1 ; периодическая проверка подключения к Интернету (с пониженным приоритетом) return StartWinAmp: IfWinNotExist, %karaoke% { ; Не нашли активного karaoke player'а IfWinNotExist, ahk_class Winamp v1.x { ; Не нашли активного KMPlayer'а ; Работаем с WinAmp'ом - запускаем проигрывание музыки SendMessage, 0x400,, 104,, ahk_class %winampid% ; проверка воспроизведения If ErrorLevel = 0 ; если не воспроизводится, то... PostMessage, 0x111, 40045,,, ahk_class %winampid% ; включить воспроизведение } } ; наверняка было выключение, поэтому проверяем подключение к Инету ; инициируем новый цикл проверки Интернета через 1 секунду If (oncheckonline <> 1) SetTimer, CheckInternet, -1000, -1 Process, Exist, CamGrabber.exe If (ErrorLevel != 0) { CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс Sleep, 10000 } Process, Exist, CamGrabber.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM CamGrabber.exe /F,, Hide Sleep, 2000 } Run, C:\CamGrabber30demorc2\CamGrabber.exe return CheckWarnings: ; Обработчик варнингов If WinAmpActive = 0 { IfWinExist, ahk_class %winampid% { ; WinAmp не был запущен, а сейчас найден в списке окон Gosub StartWinAmp WinAmpActive := 1 } } Else { IfWinNotExist, ahk_class %winampid% { WinAmpActive := 0 } Else { If (Lastcheck + 20000 < A_TickCount) { ; WinAmp был запущен и существует до сих пор, но ; давно не было проверок, возможно, работа останавливалась SendToRR("SETVAR;OnlineStatus;" . offlinestr) SetTimer, StartWinAmp, -5000 } } } If CityGuideActive = 0 { IfWinExist, %cityguide% { ; CityGuide не был запущен, а сейчас найден в списке окон WinActivate Send, 5 ; включить GPS Process, Priority, CityGuide.exe, BelowNormal ; понизить приоритет чтобы не мешал просмотру видео CityGuideActive := 1 } } Else { IfWinNotExist, %cityguide% { CityGuideActive := 0 } } If KaraokeActive = 0 { IfWinExist, %karaoke% { ; Нашли активный karaoke player - максимизируем окно WinActivate Send, !f Send, {Space} KaraokeActive := 1 } } Else { IfWinNotExist, %karaoke% { KaraokeActive := 0 } } IfWinExist, %pstripwin% { ; Найдено стартовое окно восстановления PowerStrip'а WinActivate Send, Д } IfWinExist, %winamperror% { ; Найдено окно WinAmp'а с ошибкой звукового устройства ; Вероятнее всего звуковая usb-карта не успела проинициализироваться ; закрываем окно с ошибкой и через 5 секунд пытаемся запустить PLAY WinActivate Send, {Enter} SetTimer, StartWinAmp, -5000 } IfWinExist, %svhostwin% { ; Скидываем полученную ошибку приложения (вероятнее всего служба Windows Audio) WinActivate Send, {Esc} ; SetTimer, RestartAudio, -1000 } IfWinExist, %kmperror% { ; Скидываем полученную ошибку KMP WinActivate Send, {Enter} RunWait, taskkill.exe /IM KMPlayer.exe /F,, Hide Run, C:\Program Files\The KMPlayer\KMPlayer.exe } IfWinExist, %camgrabbererror% { ; Нашли ошибку camgrabber'а - перезапускаем его WinActivate Send, {Enter} CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс мирным путём Sleep, 4000 RunWait, taskkill.exe /IM CamGrabber.exe /F,, Hide Sleep, 2000 Run, C:\CamGrabber30demorc2\CamGrabber.exe } Lastcheck := A_TickCount return RestartAudio: RunWait, net stop AudioSrv,, Hide RunWait, net start AudioSrv,, Hide return CheckInternet: ; Обработчик интернет-проверок oncheckonline := 1 If (setoffline = 1) Gosub DoOffline Gosub DoOnline oncheckonline := 0 SetTimer, CheckInternet, %checkperiod%, -1 return ; конец процедуры CheckInternet CheckJam: WinHide, avc_control.ahk ; на всяк случай снова прячем окно - бывает, что ; после перезагрузки окно с первой попытки почему-то не прячется ; Получаем время файла пробок FileGetTime, OutputVar, %myjamfile% mhour := Substr(OutputVar, 9, 2) mmin := Substr(OutputVar, 11, 2) ; Собираем текущую отметку времени (в минутах) currconntimestamp := A_Min + A_Hour*60 lastjamtimestamp := mmin + mhour*60 If (currconntimestamp < lastjamtimestamp) currconntimestamp := currconntimestamp + 24*60 ; Получаем возраст файла пробок jamtime := currconntimestamp - lastjamtimestamp jamexpired := 0 If (currconntimestamp > lastjamtimestamp + jamgreen) jamexpired := 1 If (currconntimestamp > lastjamtimestamp + jamred) jamtime := empty ; тут надо нарисовать цветом возраст пробочного файла If (jamexpired = 0) { ; Делаем зеленым SendToRR("SETVAR;MYJAMR||SETVAR;MYJAMG;" . jamtime) } Else { ; Делаем красным SendToRR("SETVAR;MYJAMG||SETVAR;MYJAMR;" . jamtime) } return ; конец процедуры CheckJam killras: Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe,, Hide Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe /F,, Hide Sleep, 5000 Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe /F,, Hide } } Sleep, 5000 } return DoOffline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") setoffline := 0 Gosub killras RunWait, rasdial %myconnection% /DISCONNECT,, Hide SendToRR("SETVAR;OnlineStatus;" . offlinestr) return DoOnline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") ; If (jamexpired = 0) ; { ; ; пробки свежие - считаем, что с тырнетом всё в порядке ; SendToRR("SETVAR;OnlineStatus;" . onlinestr) ; return ; } Loop, 5 ; предпринимаем 5 попыток подключиться { RunWait, ping -n 3 -f -w 4000 %pinghost1%,, UseErrorLevel|Hide If (ErrorLevel = 0) { SendToRR("SETVAR;OnlineStatus;" . onlinestr) Break } Else { If (online = 1) Sleep, 5000 RunWait, ping -n 3 -f -w 4000 %pinghost2%,, UseErrorLevel|Hide If (ErrorLevel = 0) { SendToRR("SETVAR;OnlineStatus;" . onlinestr) Break } Else { SendToRR("SETVAR;OnlineStatus;" . offlinestr) } } If (online = 1) { Gosub DoOffline Sleep, 2000 If (A_Index > 4) { ; 4 попытки подключиться прошли напрасно - принимаем радикальные меры ; Отключаем и снова подключаем адаптер bluetooth Gosub killras RunWait, C:\Tools\usr.exe stop -n "%btapapter%",, Hide Sleep, 2000 RunWait, C:\Tools\usr.exe return -n "%btadapter%",, Hide Sleep, 5000 ; даём системе прийти в себя после такого надругательства } RunWait, rasdial %myconnection%,, Hide } Else { Break } } return OnCopyData(wparam, lparam) { ; функция получения входящего сообщение WM_COPYDATA ; Сюда приходит вызов с полученным сообщением-командой от RR local pStr pStr := NumGet(lparam+8), len := NumGet(lparam+4) RecvMessage := SubStr(DllCall("MulDiv", "Int", pStr, "Int",1, "Int",1, "str"),1,len) If (RecvMessage = "switch") { If (online = 1) online := 0 Else online := 1 } Else { If (RecvMessage = "online") online := 1 Else online := 0 } If (online = 1) { setoffline := 0 SendToRR("SETVAR;OnlineSwitch;" . chkonline) } Else { setoffline := 1 SendToRR("SETVAR;OnlineSwitch") } If (oncheckonline <> 1) SetTimer, CheckInternet, -1000, -1 ; инициируем новый цикл проверки Интернета return 1 ; подтверждаем успешный приём сообщения } ; Функция отправки команды в RoadRunner SendToRR(msg="") { CDSSendMessage(msg, "RoadRunner") return } ; Функция отправки команды методом WM_COPY CDSSendMessage(msg, prg) { len := StrLen(msg) port := 1 VarSetCapacity(CopyDataStruct, 12, 0) NumPut(port, CopyDataStruct, 0) NumPut(len, CopyDataStruct, 4) ; тут именно len, а не len+1 как пишут в некоторых примерах NumPut(&msg, CopyDataStruct, 8) SendMessage, 0x4A,, &CopyDataStruct,, %prg% return } doSK: ; Если экранная клавиарура запущена, то управляем ею с помощью "горячей клавиши" ; Иначе - запускаем исполняемый файл IfWinExist, ahk_class TFloatingWindowLangForm { Send, ^!k } Else { Run, "C:\Program Files\ComfortKeyboard\CKeyboard.exe" } return ; Далее - обычные реакции на хоткеи ^!+c:: Critical KeyWait, c KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им ControlSend, , !`` } Else { Send, ^!5 ; AutoHide для указателя мышки } return ^!+b:: Critical KeyWait, b KeyWait, Shift KeyWait, Alt KeyWait, Control Send, {Click right} ; имитация правой кнопки мышки return ^!+a:: ; screenshot текущего экрана Critical KeyWait, a KeyWait, Shift KeyWait, Alt KeyWait, Control RunWait, nircmd savescreenshot C:\PrScr.png,, Hide FileGetTime, OutputVar, C:\PrScr.png, C FileMove C:\PrScr.png, C:\Scrns\ss_%OutputVar%.png return ^!+e:: ; Команда NEXT для WinAmp'а / KMPlayer'а / Kararoke Critical KeyWait, e KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, ^n } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им PostMessage, 0x111, 40048,,, ahk_class Winamp v1.x ; следующий трек } Else { PostMessage, 0x111, 40048,,, ahk_class RRWinamp ; следующий трек } } return ^!+f:: ; Команда PREV для WinAmp'а / KMPlayer'а / Karaoke Critical KeyWait, f KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, ^p } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им PostMessage, 0x111, 40044,,, ahk_class Winamp v1.x ; предыдущий трек } Else { PostMessage, 0x111, 40044,,, ahk_class RRWinamp ; предыдущий трек } } return ^!+h:: ; Команда PLAY/PAUSE для WinAmp'а / KMPlayer'а / Karaoke Critical KeyWait, h KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, {Space} } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им SendMessage, 0x400,, 104,, ahk_class Winamp v1.x ; проверка воспроизведения If ErrorLevel = 0 ; если не воспроизводится, то... PostMessage, 0x111, 40045,,, ahk_class Winamp v1.x ; включить воспроизведение Else ; если воспроизводится, то... PostMessage, 0x111, 40046,,, ahk_class Winamp v1.x ; поставить на паузу } Else { 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'а день/ночь Critical KeyWait, i KeyWait, Shift KeyWait, Alt KeyWait, Control if(!day) { Send, ^!1 day := 1 } else { Send, ^!2 day := 0 } return ^!+k:: ; Показывать или не показывать экранную клавиатуру Critical KeyWait, k KeyWait, Shift KeyWait, Alt KeyWait, Control Process, Exist, RoadRunner.exe If (ErrorLevel != 0) { ; Если запущен RR, то клавиатура нам нужна только для Fennec'а IfWinActive, Fennec { Gosub doSK } } Else { Gosub doSK } return
Последний раз редактировалось ashu; 17.02.2009 в 01:51.
С уважением, Алексей
Мой Prius NHW11
Поставил себе в карписю караоке от vanbasco... Всё хорошо, но уж очень мелким шрифтом пишется на экране название текущего kar-файла. Возня с настройками, реестром, ресурсами и даже письмом автору ничего не дали...
Выход был найден - autohotkey!
Скриптец максимизирует окно караоке при запуске, посылает в него {Space} для старта проигрывания и показывает в верхней части экрана название текущей песни.
karaoke.ahk:
Код:#NoTrayIcon ; не отображать значок скрипта в трее #SingleInstance force ; перезагрузить скрипт, если он уже запущен DetectHiddenWindows, On ; искать в скрытых окнах #NoEnv ; запрещаем имена переменных как у переменных окружения SendMode Input ; ускорренный ввод #Persistent ; держать скрипт запущенным SetTitleMatchMode 2 ; 2 - заголовок окна должен содержать значение, заданное в параметре CustomColor := "90FF55" MyTextEmpty := "" Gui, +Owner gui, color, 000000 gui, font, s48 bold, Arial Gui, Add, Text, c%CustomColor% x0 y0 w830 h170 vMyRed, Название песни Gui, +LastFound +AlwaysOnTop WinSet, TransColor, 000000 200 Gui, -Caption +Disabled -SysMenu Gui, Show, x-800 y0 w800 h150 NoActivate, karaoke.ahk ; окно караоке находится на втором мониторе (с координатами -800,0) KarShow := 0 WinHide, karaoke.ahk KaraokeActive := 0 karaoke := "vanBasco's Karaoke Player" ; название окна karaoke player'а kardel := ".kar - vanBasco's Karaoke Player" ; что не надо выводить в названии песни SetTimer, CheckWarnings, 2000 return ShowHideKaraoke: IfWinExist, ahk_class vanBascoPlayerClass { If (KarShow <> 1) { WinShow, karaoke.ahk KarShow := 1 } WinGetTitle, KarTitle, ahk_class vanBascoPlayerClass if (karperv <> KarTitle) { karprev := KarTitle StringReplace, KarTitle, KarTitle, %kardel%, , All StringReplace, KarTitle, KarTitle, _, %A_Space%, All StringReplace, KarTitle, KarTitle, =, `r`n, All GuiControl, Text, MyRed, %KarTitle% } } Else { If (KarShow = 1) { WinHide, karaoke.ahk KarShow = 0 } } return CheckWarnings: If KaraokeActive = 0 { IfWinExist, %karaoke% { ; Нашли активный karaoke player - максимизируем окно WinActivate Send, !f Send, {Space} KaraokeActive := 1 SetTimer, ShowHideKaraoke, 1000 ; отслеживать показ на экране } } Else { IfWinNotExist, %karaoke% { KaraokeActive := 0 SetTimer, ShowHideKaraoke, -1000 ; запустить в последний раз - чтобы скрыть окно } } return
Понятное дело, я это сделал не отдельным скриптом, а в составе моего скрипта обслуживания avc_control.ahk:
Код:#NoTrayIcon ; не отображать значок скрипта в трее #SingleInstance force ; перезагрузить скрипт, если он уже запущен DetectHiddenWindows, On ; искать в скрытых окнах #NoEnv ; запрещаем имена переменных как у переменных окружения SendMode Input ; ускорренный ввод #Persistent ; держать скрипт запущенным SetTitleMatchMode 2 ; 2 - заголовок окна должен содержать значение, заданное в параметре ; ----------- редактируемые переменные - настройки ------------ winampid := "RRWinamp" ; идентификатор класса окна винампа cityguide := "City Guide" ; название окна CityGuide myconnection := "BluetoothConnection" ; название подключения к Инету btadapter := "Jabra - A320s" ; название адаптера bluetooth pinghost1 := "193.125.152.104" ; кого мучаем пингами в первую очередь (www.relcom.ru) pinghost2 := "194.87.0.50" ; кого мучаем пингами во вторую очередь (www.ru) onlinestr := "В сети" ; сообщение "Online" на экране (переменная RR OnlineStatus) offlinestr := "---" ; сообщение "Offline" на экране chkonline := "+ +" ; сообщение "постоянное подключение" на экране pstripwin := "Меры предосторожности" ; название стартового окна восстановления PowerStrip'а svhostwin := "svchost.exe - Ошибка приложения" ; название окна ошибки службы (вероятнее всего служба Windows Audio) winamperror := "NullSoft DirectSound output" ; название окна винампа с ошибкой звукового устройства checkperiod := 30 ; через сколько секунд (примерно) запускаем процедуру проверки сети и пробок СитиГида myjamfile := "C:\Program Files\City Guide\78SPb.jam" ; за каким файлом пробок следим (боевой) ;myjamfile := "C:\CityGuide\City Guide 2.2\78SPb.jam" ; за каким файлом пробок следим (тестовый) jamgreen := 8 ; до скольки минут считать возраст пробок зеленым jamred := 50 ; до скольки минут считать возраст пробок красным empty := "нет" ; что пишем на экране, если пробочный файл очень старый camgrabbererror := "CamGraber full error" ; ошибка camgrabber'а kmperror := "KMPlayer error in file" ; ошибка kmplayer'а karaoke := "vanBasco's Karaoke Player" ; название окна karaoke player'а kardel := ".kar - vanBasco's Karaoke Player" ; что не надо выводить в названии песни ; -------- конец редактируемых переменных - настроек ---------- WinAmpActive := 0 KaraokeActive := 0 CityGuideActive := 0 day := 1 online := 0 setoffline := 0 oncheckonline := 0 Lastcheck := 0 checkperiod := - checkperiod * 1000 jamexpired := 1 karprev := "" ; Окно для получения команд управления от RR и для отображения текущей песни караоке CustomColor := "90FF55" MyTextEmpty := "" Gui, +Owner gui, color, 000000 gui, font, s48 bold, Arial Gui, Add, Text, c%CustomColor% x0 y0 w830 h170 vMyRed, Название песни Gui, +LastFound +AlwaysOnTop WinSet, TransColor, 000000 200 Gui, -Caption +Disabled -SysMenu Gui, Show, x-800 y0 w800 h150 NoActivate, avc_control.ahk KarShow := 0 WinHide, avc_control.ahk ; Устанавливаем обработчик для приёма команд через WM_COPYDATA от RR OnMessage(0x4A, "OnCopyData") SetTimer, CheckWarnings, 2000 SetTimer, CheckJam, 30000 SetTimer, CheckInternet, %checkperiod%, -1 ; периодическая проверка подключения к Интернету (с пониженным приоритетом) return ShowHideKaraoke: IfWinExist, ahk_class vanBascoPlayerClass { If (KarShow <> 1) { WinShow, avc_control.ahk KarShow := 1 } WinGetTitle, KarTitle, ahk_class vanBascoPlayerClass if (karperv <> KarTitle) { karprev := KarTitle StringReplace, KarTitle, KarTitle, %kardel%, , All StringReplace, KarTitle, KarTitle, _, %A_Space%, All StringReplace, KarTitle, KarTitle, =, `r`n, All GuiControl, Text, MyRed, %KarTitle% } } Else { If (KarShow = 1) { WinHide, avc_control.ahk KarShow = 0 } } return StartWinAmp: IfWinNotExist, %karaoke% { ; Не нашли активного karaoke player'а IfWinNotExist, ahk_class Winamp v1.x { ; Не нашли активного KMPlayer'а ; Работаем с WinAmp'ом - запускаем проигрывание музыки SendMessage, 0x400,, 104,, ahk_class %winampid% ; проверка воспроизведения If ErrorLevel = 0 ; если не воспроизводится, то... PostMessage, 0x111, 40045,,, ahk_class %winampid% ; включить воспроизведение } } ; наверняка было выключение, поэтому проверяем подключение к Инету ; инициируем новый цикл проверки Интернета через 1 секунду If (oncheckonline <> 1) SetTimer, CheckInternet, -1000, -1 Process, Exist, CamGrabber.exe If (ErrorLevel != 0) { CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс Sleep, 10000 } Process, Exist, CamGrabber.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM CamGrabber.exe /F,, Hide Sleep, 2000 } Run, C:\CamGrabber30demorc2\CamGrabber.exe return CheckWarnings: ; Обработчик варнингов If WinAmpActive = 0 { IfWinExist, ahk_class %winampid% { ; WinAmp не был запущен, а сейчас найден в списке окон Gosub StartWinAmp WinAmpActive := 1 } } Else { IfWinNotExist, ahk_class %winampid% { WinAmpActive := 0 } Else { If (Lastcheck + 20000 < A_TickCount) { ; WinAmp был запущен и существует до сих пор, но ; давно не было проверок, возможно, работа останавливалась SendToRR("SETVAR;OnlineStatus;" . offlinestr) SetTimer, StartWinAmp, -5000 } } } If CityGuideActive = 0 { IfWinExist, %cityguide% { ; CityGuide не был запущен, а сейчас найден в списке окон WinActivate Send, 5 ; включить GPS Process, Priority, CityGuide.exe, BelowNormal ; понизить приоритет чтобы не мешал просмотру видео CityGuideActive := 1 } } Else { IfWinNotExist, %cityguide% { CityGuideActive := 0 } } If KaraokeActive = 0 { IfWinExist, %karaoke% { ; Нашли активный karaoke player - максимизируем окно WinActivate Send, !f Send, {Space} KaraokeActive := 1 SetTimer, ShowHideKaraoke, 1000 ; отслеживать показ на экране } } Else { IfWinNotExist, %karaoke% { KaraokeActive := 0 SetTimer, ShowHideKaraoke, -1000 ; запустить в последний раз - чтобы скрыть окно } } IfWinExist, %pstripwin% { ; Найдено стартовое окно восстановления PowerStrip'а WinActivate Send, Д } IfWinExist, %winamperror% { ; Найдено окно WinAmp'а с ошибкой звукового устройства ; Вероятнее всего звуковая usb-карта не успела проинициализироваться ; закрываем окно с ошибкой и через 5 секунд пытаемся запустить PLAY WinActivate Send, {Enter} SetTimer, StartWinAmp, -5000 } IfWinExist, %svhostwin% { ; Скидываем полученную ошибку приложения (вероятнее всего служба Windows Audio) WinActivate Send, {Esc} ; SetTimer, RestartAudio, -1000 } IfWinExist, %kmperror% { ; Скидываем полученную ошибку KMP WinActivate Send, {Enter} RunWait, taskkill.exe /IM KMPlayer.exe /F,, Hide Run, C:\Program Files\The KMPlayer\KMPlayer.exe } IfWinExist, %camgrabbererror% { ; Нашли ошибку camgrabber'а - перезапускаем его WinActivate Send, {Enter} CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс мирным путём Sleep, 4000 RunWait, taskkill.exe /IM CamGrabber.exe /F,, Hide Sleep, 2000 Run, C:\CamGrabber30demorc2\CamGrabber.exe } Lastcheck := A_TickCount return RestartAudio: RunWait, net stop AudioSrv,, Hide RunWait, net start AudioSrv,, Hide return CheckInternet: ; Обработчик интернет-проверок oncheckonline := 1 If (setoffline = 1) Gosub DoOffline Gosub DoOnline oncheckonline := 0 SetTimer, CheckInternet, %checkperiod%, -1 return ; конец процедуры CheckInternet CheckJam: ;WinHide, avc_control.ahk ; на всяк случай снова прячем окно - бывает, что ; после перезагрузки окно с первой попытки почему-то не прячется ; Получаем время файла пробок FileGetTime, OutputVar, %myjamfile% mhour := Substr(OutputVar, 9, 2) mmin := Substr(OutputVar, 11, 2) ; Собираем текущую отметку времени (в минутах) currconntimestamp := A_Min + A_Hour*60 lastjamtimestamp := mmin + mhour*60 If (currconntimestamp < lastjamtimestamp) currconntimestamp := currconntimestamp + 24*60 ; Получаем возраст файла пробок jamtime := currconntimestamp - lastjamtimestamp jamexpired := 0 If (currconntimestamp > lastjamtimestamp + jamgreen) jamexpired := 1 If (currconntimestamp > lastjamtimestamp + jamred) jamtime := empty ; тут надо нарисовать цветом возраст пробочного файла If (jamexpired = 0) { ; Делаем зеленым SendToRR("SETVAR;MYJAMR||SETVAR;MYJAMG;" . jamtime) } Else { ; Делаем красным SendToRR("SETVAR;MYJAMG||SETVAR;MYJAMR;" . jamtime) } return ; конец процедуры CheckJam killras: Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe,, Hide Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe /F,, Hide Sleep, 5000 Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe /F,, Hide } } Sleep, 5000 } return DoOffline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") setoffline := 0 Gosub killras RunWait, rasdial %myconnection% /DISCONNECT,, Hide SendToRR("SETVAR;OnlineStatus;" . offlinestr) return DoOnline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") ; If (jamexpired = 0) ; { ; ; пробки свежие - считаем, что с тырнетом всё в порядке ; SendToRR("SETVAR;OnlineStatus;" . onlinestr) ; return ; } Loop, 5 ; предпринимаем 5 попыток подключиться { RunWait, ping -n 3 -f -w 4000 %pinghost1%,, UseErrorLevel|Hide If (ErrorLevel = 0) { SendToRR("SETVAR;OnlineStatus;" . onlinestr) Break } Else { If (online = 1) Sleep, 5000 RunWait, ping -n 3 -f -w 4000 %pinghost2%,, UseErrorLevel|Hide If (ErrorLevel = 0) { SendToRR("SETVAR;OnlineStatus;" . onlinestr) Break } Else { SendToRR("SETVAR;OnlineStatus;" . offlinestr) } } If (online = 1) { Gosub DoOffline Sleep, 2000 If (A_Index > 4) { ; 4 попытки подключиться прошли напрасно - принимаем радикальные меры ; Отключаем и снова подключаем адаптер bluetooth Gosub killras RunWait, C:\Tools\usr.exe stop -n "%btapapter%",, Hide Sleep, 2000 RunWait, C:\Tools\usr.exe return -n "%btadapter%",, Hide Sleep, 5000 ; даём системе прийти в себя после такого надругательства } RunWait, rasdial %myconnection%,, Hide } Else { Break } } return OnCopyData(wparam, lparam) { ; функция получения входящего сообщение WM_COPYDATA ; Сюда приходит вызов с полученным сообщением-командой от RR local pStr pStr := NumGet(lparam+8), len := NumGet(lparam+4) RecvMessage := SubStr(DllCall("MulDiv", "Int", pStr, "Int",1, "Int",1, "str"),1,len) If (RecvMessage = "switch") { If (online = 1) online := 0 Else online := 1 } Else { If (RecvMessage = "online") online := 1 Else online := 0 } If (online = 1) { setoffline := 0 SendToRR("SETVAR;OnlineSwitch;" . chkonline) } Else { setoffline := 1 SendToRR("SETVAR;OnlineSwitch") } If (oncheckonline <> 1) SetTimer, CheckInternet, -1000, -1 ; инициируем новый цикл проверки Интернета return 1 ; подтверждаем успешный приём сообщения } ; Функция отправки команды в RoadRunner SendToRR(msg="") { CDSSendMessage(msg, "RoadRunner") return } ; Функция отправки команды методом WM_COPY CDSSendMessage(msg, prg) { len := StrLen(msg) port := 1 VarSetCapacity(CopyDataStruct, 12, 0) NumPut(port, CopyDataStruct, 0) NumPut(len, CopyDataStruct, 4) ; тут именно len, а не len+1 как пишут в некоторых примерах NumPut(&msg, CopyDataStruct, 8) SendMessage, 0x4A,, &CopyDataStruct,, %prg% return } doSK: ; Если экранная клавиарура запущена, то управляем ею с помощью "горячей клавиши" ; Иначе - запускаем исполняемый файл IfWinExist, ahk_class TFloatingWindowLangForm { Send, ^!k } Else { Run, "C:\Program Files\ComfortKeyboard\CKeyboard.exe" } return ; Далее - обычные реакции на хоткеи ^!+c:: Critical KeyWait, c KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им ControlSend, , !`` } Else { Send, ^!5 ; AutoHide для указателя мышки } return ^!+b:: Critical KeyWait, b KeyWait, Shift KeyWait, Alt KeyWait, Control Send, {Click right} ; имитация правой кнопки мышки return ^!+a:: ; screenshot текущего экрана Critical KeyWait, a KeyWait, Shift KeyWait, Alt KeyWait, Control RunWait, nircmd savescreenshot C:\PrScr.png,, Hide FileGetTime, OutputVar, C:\PrScr.png, C FileMove C:\PrScr.png, C:\Scrns\ss_%OutputVar%.png return ^!+e:: ; Команда NEXT для WinAmp'а / KMPlayer'а / Kararoke Critical KeyWait, e KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, ^n } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им PostMessage, 0x111, 40048,,, ahk_class Winamp v1.x ; следующий трек } Else { PostMessage, 0x111, 40048,,, ahk_class RRWinamp ; следующий трек } } return ^!+f:: ; Команда PREV для WinAmp'а / KMPlayer'а / Karaoke Critical KeyWait, f KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, ^p } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им PostMessage, 0x111, 40044,,, ahk_class Winamp v1.x ; предыдущий трек } Else { PostMessage, 0x111, 40044,,, ahk_class RRWinamp ; предыдущий трек } } return ^!+h:: ; Команда PLAY/PAUSE для WinAmp'а / KMPlayer'а / Karaoke Critical KeyWait, h KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, {Space} } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им ; DoubleClick в окно проигрывателя - Play|Pause WinActivate Send, {Space} ; SendMessage, 0x400,, 104,, ahk_class Winamp v1.x ; проверка воспроизведения ; If ErrorLevel = 0 ; если не воспроизводится, то... ; PostMessage, 0x111, 40045,,, ahk_class Winamp v1.x ; включить воспроизведение ; Else ; если воспроизводится, то... ; PostMessage, 0x111, 40046,,, ahk_class Winamp v1.x ; поставить на паузу } Else { 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'а день/ночь Critical KeyWait, i KeyWait, Shift KeyWait, Alt KeyWait, Control if(!day) { Send, ^!1 day := 1 } else { Send, ^!2 day := 0 } return ^!+k:: ; Показывать или не показывать экранную клавиатуру Critical KeyWait, k KeyWait, Shift KeyWait, Alt KeyWait, Control Process, Exist, RoadRunner.exe If (ErrorLevel != 0) { ; Если запущен RR, то клавиатура нам нужна только для Fennec'а IfWinActive, Fennec { Gosub doSK } } Else { Gosub doSK } return
Последний раз редактировалось ashu; 01.03.2009 в 23:21.
С уважением, Алексей
Мой Prius NHW11
Если надо часто совершать какие-то единообразные операции копирования иль перемещения файлов (например, сгружать на флешку снятое CamGrabber'ом видео с маршрутной камеры иль заливать новые музыкальные или видеофайлы), то можно этот процесс слегка автоматизировать при помощи того же autohotkey.
Пример для встраивания в ваш скрипт:
Процедура VideoMove из данного примера производит перенос файлов по маске C:\camera\*.* на флешку в каталог G:\camera. Если такого каталога обнаружить не удалось, производится попытка произвести перенос файлов в альтернативный каталог F:\camera. Если и такого каталога не найдено, выдается предупреждение и работа завершается.Код:videosource := "C:\camera\*.*" ; маска видеофайлов для переноса на usb-накопитель videodest := "G:\camera" ; путь, куда надо переносить видеофайлы отключения из системы videodest2 := "F:\camera" ; альтернативный путь, куда надо переносить видеофайлы onvideomove := 0 VideoMove: onvideomove := 1 readyformove := 0 allsize := 0 allcount := 0 cursize := 0 curcount := 0 curvideodestfound := 0 if InStr(FileExist(videodest), "D") { curvideodest := videodest curvideodestfound := 1 } Else { if InStr(FileExist(videodest2), "D") { curvideodest := videodest2 curvideodestfound := 2 } } If (curvideodestfound > 0) { DriveSpaceFree, destspace, %curvideodest% Loop, %videosource% { allsize := allsize + A_LoopFileSizeKB allcount := allcount + 1 } needspace := round(allsize/1024 - destspace)+1 if(needspace > 0) { Progress, B ZH0 W600 H120 CW000000 CB00F000 CT00D000 FM20 FS18 WM1000 WS700, `nНа USB-накопителе не хватает %needspace%Mb!`nПеренос видеофайлов не возможен!,,, Courier New Sleep, 5000 Progress, Off } Else { readyformove := 1 } } Else { Progress, B ZH0 W600 H120 CW000000 CB00F000 CT00D000 FM20 FS18 WM1000 WS700, `nUSB-накопитель не найден!`nПеренос видеофайлов не возможен!,,, Courier New Sleep, 5000 Progress, Off } if(readyformove == 1) { Progress, B R0-%allsize% ZH50 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, 0`%`r`n0 of %allcount%`r`n%a_space%, Переношу маршрутное видео, Перенос видеозаписей, Tahoma copytime := A_TickCount copyspeedtext := a_space Loop, %videosource% { prometer := round(cursize * 100 / allsize) Progress, %cursize%, %curcount% of %allcount%`n%prometer%`% объёма%copyspeedtext% cursize := cursize + A_LoopFileSizeKB curcount := curcount + 1 curcopytime := (A_TickCount - copytime) / 1000 copyspeed := round((allsize - cursize) / (cursize / curcopytime)) copyspeedtext := ", осталось " copyspeed " сек" FileMove, %A_LoopFileLongPath%, %curvideodest%, 1 if ErrorLevel { Progress, B ZH0 W600 H120 CW000000 CB00F000 CT00D000 FM20 FS18 WM1000 WS700, `nОшибка переноса %A_LoopFileName%!`nПеренос видеофайлов не возможен!,,, Courier New Sleep, 15000 Progress, Off onvideomove := 0 return } } Progress, %cursize%, %curcount% of %allcount%`n100`% объёма Sleep, 3000 Progress, Off } onvideomove := 0 return
Если каталог назначения найден, рисуется progress процесса переноса.
Процедуру можно вызывать по удобному вам событию - по нажатию горячей клавиши, по таймеру, по сообщению, посланному через WM_COPY, иль каким-нибудь другим образом.
Последний раз редактировалось ashu; 30.03.2009 в 18:29.
С уважением, Алексей
Мой Prius NHW11
Я в своём скрипте avc_control.ahk сделал вызов по нажатию кнопки в скине RR - посылаю команду SENDMSG;avc_control.ahk;videomove, а по завершению переноса файлов принудительно отключаю флешку командой usr.exe stop -d буква_диска_флешки:
Код:#NoTrayIcon ; не отображать значок скрипта в трее #SingleInstance force ; перезагрузить скрипт, если он уже запущен DetectHiddenWindows, On ; искать в скрытых окнах #NoEnv ; запрещаем имена переменных как у переменных окружения SendMode Input ; ускорренный ввод #Persistent ; держать скрипт запущенным SetTitleMatchMode 2 ; 2 - заголовок окна должен содержать значение, заданное в параметре ; ----------- редактируемые переменные - настройки ------------ winampid := "RRWinamp" ; идентификатор класса окна винампа cityguide := "City Guide" ; название окна CityGuide myconnection := "BluetoothConnection" ; название подключения к Инету btadapter := "Jabra - A320s" ; название адаптера bluetooth pinghost1 := "193.125.152.104" ; кого мучаем пингами в первую очередь (www.relcom.ru) pinghost2 := "194.87.0.50" ; кого мучаем пингами во вторую очередь (www.ru) onlinestr := "В сети" ; сообщение "Online" на экране (переменная RR OnlineStatus) offlinestr := "---" ; сообщение "Offline" на экране chkonline := "+ +" ; сообщение "постоянное подключение" на экране pstripwin1 := "Меры предосторожности" ; название стартового окна 1 восстановления PowerStrip'а pstripwin2 := "PowerStrip Configuration Problem" ; название стартового окна 2 восстановления PowerStrip'а svhostwin := "svchost.exe - Ошибка приложения" ; название окна ошибки службы (вероятнее всего служба Windows Audio) winamperror := "DirectSound output" ; название окна винампа с ошибкой звукового устройства winamppath := "C:\Program Files\Winamp\winamp.exe" ; путь к исполняемому файлу winamp'а checkperiod := 30 ; через сколько секунд (примерно) запускаем процедуру проверки сети и пробок СитиГида ;myjamfile := "C:\Program Files\City Guide\78SPb.jam" ; за каким файлом пробок следим (боевой) myjamfile := "C:\Program Files\City Guide CarPC 3\78SPb.jam" ; за каким файлом пробок следим (тестовый) jamgreen := 8 ; до скольки минут считать возраст пробок зеленым jamred := 50 ; до скольки минут считать возраст пробок красным empty := "нет" ; что пишем на экране, если пробочный файл очень старый camgrabbererror := "CamGraber full error" ; ошибка camgrabber'а kmperror := "KMPlayer error in file" ; ошибка kmplayer'а karaoke := "vanBasco's Karaoke Player" ; название окна karaoke player'а kardel := ".kar - vanBasco's Karaoke Player" ; что не надо выводить в названии песни videosource := "C:\camera\*.*" ; маска видеофайлов для переноса на usb-накопитель gpsdatasource := "C:\GpsData\*.*" ; маска файлов с gps-инфой (их только копируем) videodest := "G:\camera" ; путь, куда надо переносить видеофайлы videodestD := "G" ; буква диска пути для отключения из системы videodest2 := "F:\camera" ; альтернативный путь, куда надо переносить видеофайлы videodest2D := "F" ; буква диска альтернативного пути для отключения из системы ; -------- конец редактируемых переменных - настроек ---------- WinAmpActive := 1 WinAmpWait := 0 KaraokeActive := 0 CityGuideActive := 0 day := 1 online := 0 setoffline := 0 oncheckonline := 0 Lastcheck := 0 checkperiod := - checkperiod * 1000 jamexpired := 1 karprev := "" onvideomove := 0 KMPActive := 0 ; Окно для получения команд управления от RR и для отображения текущей песни караоке CustomColor := "90FF55" MyTextEmpty := "" Gui, +Owner gui, color, 000000 gui, font, s48 bold, Arial Gui, Add, Text, c%CustomColor% x0 y0 w830 h170 vMyRed, Название песни Gui, +LastFound +AlwaysOnTop WinSet, TransColor, 000000 200 Gui, -Caption +Disabled -SysMenu Gui, Show, x-800 y0 w800 h150 NoActivate, avc_control.ahk KarShow := 0 WinHide, avc_control.ahk ; Устанавливаем обработчик для приёма команд через WM_COPYDATA от RR OnMessage(0x4A, "OnCopyData") SetTimer, CheckWarnings, 2000 SetTimer, CheckJam, 30000 SetTimer, CheckInternet, %checkperiod%, -1 ; периодическая проверка подключения к Интернету (с пониженным приоритетом) return ShowHideKaraoke: IfWinExist, ahk_class vanBascoPlayerClass { If (KarShow <> 1) { WinShow, avc_control.ahk KarShow := 1 } WinGetTitle, KarTitle, ahk_class vanBascoPlayerClass if (karperv <> KarTitle) { karprev := KarTitle StringReplace, KarTitle, KarTitle, %kardel%, , All StringReplace, KarTitle, KarTitle, _, %A_Space%, All StringReplace, KarTitle, KarTitle, =, `r`n, All GuiControl, Text, MyRed, %KarTitle% } } Else { If (KarShow = 1) { WinHide, avc_control.ahk KarShow = 0 } } return StartWinAmp: IfWinNotExist, %karaoke% { ; Не нашли активного karaoke player'а IfWinNotExist, ahk_class Winamp v1.x { ; Не нашли активного KMPlayer'а ; Работаем с WinAmp'ом - запускаем проигрывание музыки IfWinNotExist, ahk_class %winampid% { WinAmpWait := WinAmpWait + 1 If(WinAmpWait > 3) { ; Не нашли активного WinAmp'а - запускаем Run, %winamppath% /class=%winampid%,, Hide WinAmpActive := 1 WinAmpWait := 0 WinWait, ahk_class %winampid%,, 5 } } Else { WinAmpWait := 0 } IfWinExist, ahk_class %winampid% { SendMessage, 0x400,, 104,, ahk_class %winampid% ; проверка воспроизведения If ErrorLevel = 0 ; если не воспроизводится, то... PostMessage, 0x111, 40045,,, ahk_class %winampid% ; включить воспроизведение } } } ; Process, Exist, CamGrabber.exe ; If (ErrorLevel != 0) ; { ; CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс ; Sleep, 10000 ; } ; Process, Exist, CamGrabber.exe ; If (ErrorLevel != 0) ; { ; RunWait, taskkill.exe /IM CamGrabber.exe /F,, Hide ; Sleep, 2000 ; } ; Run, C:\CamGrabber31demo\CamGrabber.exe Process, Exist, CamGrabber.exe If (ErrorLevel = 0) { Run, C:\CamGrabber31demo\CamGrabber.exe } return CheckWarnings: ; Обработчик варнингов ; CDSSendMessage("SAY1ashu", "CamGrabber") ; Обновляем подпись CamGrabber'а CDSSendMessage("SETVAR;MYSAT;`%SatCount`%||SETVAR;MYALT;`%Alt`%||SETVAR;GPSDATE;`%GPSDate`%||SETVAR;GPSTIME;`%GPSTime`%", "ahk_class TCamGrabberSubTitles", WinExist("RoadRunner")) ; Просим CGSubTitles.exe отдать в RR число спутников и пр. If WinAmpActive = 0 { IfWinExist, ahk_class %winampid% { ; WinAmp не был запущен, а сейчас найден в списке окон WinAmpActive := 1 WinAmpWait := 0 Gosub StartWinAmp } Else { ; WinAmp не был запущен, да и сейчас его что-то не видно Gosub StartWinAmp } } Else { IfWinNotExist, ahk_class %winampid% { WinAmpActive := 0 Gosub StartWinAmp } Else { If (Lastcheck + 20000 < A_TickCount) { ; WinAmp был запущен и существует до сих пор, но ; давно не было проверок, возможно, работа останавливалась SendToRR("SETVAR;OnlineStatus;" . offlinestr) SetTimer, StartWinAmp, -3000 ; наверняка было выключение, поэтому проверяем подключение к Инету ; инициируем новый цикл проверки Интернета через 1 секунду If (oncheckonline <> 1) SetTimer, CheckInternet, -1000, -1 } } } If CityGuideActive = 0 { IfWinExist, %cityguide% { ; CityGuide не был запущен, а сейчас найден в списке окон ; tmp := A_BatchLines ; SetBatchLines, -1 ; WinActivate ; WinWaitActive ; Send, 5 ; включить GPS ; Process, Priority, CityGuide.exe, BelowNormal ; понизить приоритет чтобы не мешал просмотру видео ; SetBatchLines, %tmp% CityGuideActive := 1 } } Else { IfWinNotExist, %cityguide% { CityGuideActive := 0 } } If KMPActive = 0 { IfWinExist, ahk_class Winamp v1.x { ; KMPlayer не был запущен, а сейчас найден в списке окон ; понижаем приоритет СитиГида Process, Priority, CityGuide.exe, BelowNormal ; понизить приоритет чтобы не мешал просмотру видео KMPActive := 1 } } Else { IfWinNotExist, ahk_class Winamp v1.x { Process, Priority, CityGuide.exe, Normal ; вернуть приоритет в normal - видео выключено KMPActive := 0 } } If KaraokeActive = 0 { IfWinExist, %karaoke% { ; Нашли активный karaoke player - максимизируем окно WinActivate Send, !f Send, {Space} KaraokeActive := 1 SetTimer, ShowHideKaraoke, 1000 ; отслеживать показ на экране } } Else { IfWinNotExist, %karaoke% { KaraokeActive := 0 SetTimer, ShowHideKaraoke, -1000 ; запустить в последний раз - чтобы скрыть окно } } IfWinExist, %pstripwin1% { ; Найдено стартовое окно 1 восстановления PowerStrip'а WinActivate Send, Д } IfWinExist, %pstripwin2% { ; Найдено стартовое окно 2 восстановления PowerStrip'а WinActivate Send, Y } IfWinExist, %winamperror% { ; Найдено окно WinAmp'а с ошибкой звукового устройства ; Вероятнее всего звуковая usb-карта не успела проинициализироваться ; закрываем окно с ошибкой и через 5 секунд пытаемся запустить PLAY WinActivate Send, {Enter} SetTimer, StartWinAmp, -5000 } IfWinExist, %svhostwin% { ; Скидываем полученную ошибку приложения (вероятнее всего служба Windows Audio) WinActivate Send, {Esc} ; SetTimer, RestartAudio, -1000 } IfWinExist, %kmperror% { ; Скидываем полученную ошибку KMP WinActivate Send, {Enter} RunWait, taskkill.exe /IM KMPlayer.exe /F,, Hide Run, C:\Program Files\The KMPlayer\KMPlayer.exe } ; IfWinExist, %camgrabbererror% ; { ; Нашли ошибку camgrabber'а - перезапускаем его ; WinActivate ; Send, {Enter} ; CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс мирным путём ; Sleep, 4000 ; RunWait, taskkill.exe /IM CamGrabber.exe /F,, Hide ; Sleep, 2000 ; Run, C:\CamGrabber31demo\CamGrabber.exe ; } Lastcheck := A_TickCount return RestartAudio: RunWait, net stop AudioSrv,, Hide RunWait, net start AudioSrv,, Hide return CheckInternet: ; Обработчик интернет-проверок oncheckonline := 1 If (setoffline = 1) Gosub DoOffline Gosub DoOnline oncheckonline := 0 SetTimer, CheckInternet, %checkperiod%, -1 return ; конец процедуры CheckInternet CheckJam: ; Получаем время файла пробок FileGetTime, OutputVar, %myjamfile% mhour := Substr(OutputVar, 9, 2) mmin := Substr(OutputVar, 11, 2) ; Собираем текущую отметку времени (в минутах) currconntimestamp := A_Min + A_Hour*60 lastjamtimestamp := mmin + mhour*60 If (currconntimestamp < lastjamtimestamp) currconntimestamp := currconntimestamp + 24*60 ; Получаем возраст файла пробок jamtime := currconntimestamp - lastjamtimestamp jamexpired := 0 If (currconntimestamp > lastjamtimestamp + jamgreen) jamexpired := 1 If (currconntimestamp > lastjamtimestamp + jamred) jamtime := empty ; тут надо нарисовать цветом возраст пробочного файла If (jamexpired = 0) { ; Делаем зеленым SendToRR("SETVAR;MYJAMR||SETVAR;MYJAMG;" . jamtime) } Else { ; Делаем красным SendToRR("SETVAR;MYJAMG||SETVAR;MYJAMR;" . jamtime) } return ; конец процедуры CheckJam killras: Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe,, Hide Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe,, Hide Sleep, 5000 Process, Exist, rasdial.exe If (ErrorLevel != 0) { RunWait, taskkill.exe /IM rasdial.exe /F,, Hide } } Sleep, 5000 } return DoOffline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") setoffline := 0 ; Gosub killras RunWait, rasdial %myconnection% /DISCONNECT,, Hide SendToRR("SETVAR;OnlineStatus;" . offlinestr) return DoOnline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") ; If (jamexpired = 0) ; { ; ; пробки свежие - считаем, что с тырнетом всё в порядке ; SendToRR("SETVAR;OnlineStatus;" . onlinestr) ; return ; } Loop, 5 ; предпринимаем 5 попыток подключиться { RunWait, ping -n 3 -f -w 4000 %pinghost1%,, UseErrorLevel|Hide If (ErrorLevel = 0) { SendToRR("SETVAR;OnlineStatus;" . onlinestr) Break } Else { If (online = 1) Sleep, 5000 RunWait, ping -n 3 -f -w 4000 %pinghost2%,, UseErrorLevel|Hide If (ErrorLevel = 0) { SendToRR("SETVAR;OnlineStatus;" . onlinestr) Break } Else { SendToRR("SETVAR;OnlineStatus;" . offlinestr) } } If (online = 1) { Gosub DoOffline Sleep, 2000 If (A_Index > 4) { ; 4 попытки подключиться прошли напрасно - принимаем радикальные меры ; Отключаем и снова подключаем адаптер bluetooth Gosub killras PostMessage, 0x111, 7049,,, ahk_class AfxWnd42 ; bluetooth off Sleep, 4000 PostMessage, 0x111, 7048,,, ahk_class AfxWnd42 ; bluetooth on Sleep, 8000 ; RunWait, C:\Tools\usr.exe stop -n "%btapapter%",, Hide ; Sleep, 2000 ; RunWait, C:\Tools\usr.exe return -n "%btadapter%",, Hide } RunWait, rasdial %myconnection%,, Hide } Else { Break } } return VideoMove: onvideomove := 1 readyformove := 0 allsize := 0 allcount := 0 cursize := 0 curcount := 0 curvideodestfound := 0 if InStr(FileExist(videodest), "D") { curvideodest := videodest curvideodestD := videodestD curvideodestfound := 1 gpsdatadest := curvideodestD . ":\GpsData" } Else { if InStr(FileExist(videodest2), "D") { curvideodest := videodest2 curvideodestD := videodest2D curvideodestfound := 2 gpsdatadest := curvideodestD . ":\GpsData" } } If (curvideodestfound > 0) { DriveSpaceFree, destspace, %curvideodest% Loop, %videosource% { allsize := allsize + A_LoopFileSizeKB allcount := allcount + 1 } needspace := round(allsize/1024 - destspace)+10 if(needspace > 0) { Progress, B ZH0 W600 H120 CW000000 CB00F000 CT00D000 FM20 FS18 WM1000 WS700, `nНа USB-накопителе не хватает %needspace%Mb!`nПеренос видеофайлов не возможен!,,, Courier New Sleep, 5000 Progress, Off } Else { readyformove := 1 } } Else { Progress, B ZH0 W600 H120 CW000000 CB00F000 CT00D000 FM20 FS18 WM1000 WS700, `nUSB-накопитель не найден!`nПеренос видеофайлов не возможен!,,, Courier New Sleep, 5000 Progress, Off } if(readyformove == 1) { Progress, B R0-%allsize% Y410 ZH50 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, 0`%`r`n0 of %allcount%`r`n%a_space%, Перенос маршрутного видео, Перенос видеозаписей, Tahoma copytime := A_TickCount copyspeedtext := a_space Loop, %videosource% { prometer := round(cursize * 100 / allsize) Progress, %cursize%, %curcount% из %allcount%`n%prometer%`% объёма%copyspeedtext% FileMove, %A_LoopFileLongPath%, %curvideodest%, 1 if ErrorLevel { Progress, B ZH0 W600 H120 CW000000 CB00F000 CT00D000 FM20 FS18 WM1000 WS700, `nОшибка переноса %A_LoopFileName%!`nПеренос видеофайлов не возможен!,,, Courier New Sleep, 5000 Progress, Off onvideomove := 0 return } cursize := cursize + A_LoopFileSizeKB curcount := curcount + 1 curcopytime := (A_TickCount - copytime) / 1000 copyspeed := round((allsize - cursize) / (cursize / curcopytime)) If(curcount > 4) { copyspeedtext := ", осталось " copyspeed " сек" } } Progress, %cursize%, %curcount% из %allcount%`n100`% объёма FileCreateDir, %gpsdatadest% allcount := 0 Loop, %gpsdatasource% { allcount := allcount + 1 } Progress, Off Progress, B R0-%allcount% Y410 ZH50 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, 0`%`r`n0 of %allcount%`r`n%a_space%, Перенос gps-данных, Перенос gps-данных, Tahoma cur := 0 Loop, %gpsdatasource% { Progress, %cur%, %cur% из %allcount%`n FileCopy, %A_LoopFileLongPath%, %gpsdatadest%, 1 cur := cur + 1 } Progress, %cur%, %cur% из %allcount%`n RunWait, C:\Tools\usr.exe stop -d %curvideodestD%,, Hide ; Sleep, 3000 Progress, Off } onvideomove := 0 return CreateGpsTitles: allcount := 0 curcount := 0 Loop, %videosource% { If(!(A_LoopFileExt = "SRT")) { allcount := allcount + 1 } } Progress, B R0-%allcount% Y410 ZH50 ZX20 ZY10 W600 H190 CW000000 CB00F000 CT00D000 FM24 FS20 WM1000 WS700, 0`%`r`n0 of %allcount%, Создание субтитров к маршрутному видео, Создание субтитров, Tahoma Loop, %videosource% { If(!(A_LoopFileExt = "SRT")) { Progress, %curcount%, %curcount% из %allcount%`n RunWait, C:\CGSubTitles\CGSubTitles.exe %A_LoopFileLongPath%,, Hide curcount := curcount + 1 } } Progress, %cursize%, %curcount% из %allcount%`n Sleep, 1000 Progress, Off return OnCopyData(wparam, lparam) { ; функция получения входящего сообщение WM_COPYDATA ; Сюда приходит вызов с полученным сообщением-командой от RR local pStr pStr := NumGet(lparam+8), len := NumGet(lparam+4) RecvMessage := SubStr(DllCall("MulDiv", "Int", pStr, "Int",1, "Int",1, "str"),1,len) If (RecvMessage = "switch") { If (online = 1) online := 0 Else online := 1 } Else If (RecvMessage = "online") { online := 1 } Else If (RecvMessage = "offline") { online := 0 } Else If (RecvMessage = "videomove") { If (onvideomove <> 1) SetTimer, VideoMove, -1000, -1 ; инициируем перенос видеофайлов } Else If(RecvMessage = "creategpstitles") { SetTimer, CreateGpsTitles, -1000, -1 ; инициируем создание субтитров } Else If(RecvMessage = "movecg") { WinShow, %cityguide% WinSet, Style, -0xC00000, %cityguide% WinSet, Region,, %cityguide% WinActivate, %cityguide% WinMove, %cityguide%, , -803, -36, 804, 640 } Else If(RecvMessage = "moveigo") { WinShow, iGO8 WinSet, Style, -0xC00000, iGO8 WinSet, Region,, iGO8 WinActivate, iGO8 WinMove, iGO8, , -760, 0, 720, 600 } Else If(RecvMessage = "movegisrx") { WinShow, gisrx WinSet, Style, -0xC00000, gisrx WinSet, Region,, gisrx WinActivate, gisrx WinMove, gisrx, , -760, 0, 720, 600 } If (online = 1) { setoffline := 0 SendToRR("SETVAR;OnlineSwitch;" . chkonline) } Else { setoffline := 1 SendToRR("SETVAR;OnlineSwitch") } If (oncheckonline <> 1) SetTimer, CheckInternet, -1000, -1 ; инициируем новый цикл проверки Интернета return 1 ; подтверждаем успешный приём сообщения } ; Функция отправки команды в RoadRunner SendToRR(msg="") { CDSSendMessage(msg, "RoadRunner") return } ; Функция отправки команды методом WM_COPY CDSSendMessage(msg, prg, hndl="") { len := StrLen(msg) port := 1 VarSetCapacity(CopyDataStruct, 12, 0) NumPut(port, CopyDataStruct, 0) NumPut(len, CopyDataStruct, 4) ; тут именно len, а не len+1 как пишут в некоторых примерах NumPut(&msg, CopyDataStruct, 8) SendMessage, 0x4A, %hndl%, &CopyDataStruct,, %prg% return } doSK: ; Если экранная клавиарура запущена, то управляем ею с помощью "горячей клавиши" ; Иначе - запускаем исполняемый файл IfWinExist, ahk_class TFloatingWindowLangForm { Send, ^!k } Else { Run, "C:\Program Files\ComfortKeyboard\CKeyboard.exe" } return ; Далее - обычные реакции на хоткеи ^!+c:: Critical KeyWait, c KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им ControlSend, , !`` } Else { Send, ^!5 ; AutoHide для указателя мышки } return ^!+b:: Critical KeyWait, b KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, ahk_class vanBascoPlayerClass { ; нашли активный караоке плейер - удаляем текущую песню с диска WinGetTitle, KarTitle, ahk_class vanBascoPlayerClass StringReplace, KarTitle, KarTitle, %kardel%, , All FileDelete, c:\karaoke.mega\%KarTitle%.kar WinActivate, %karaoke% Send, ^n } Else { Send, {Click right} ; имитация правой кнопки мышки } return ; скриншот вс ж лучше делает shup ;) ;^!+a:: ; screenshot текущего экрана ; Critical ; KeyWait, a ; KeyWait, Shift ; KeyWait, Alt ; KeyWait, Control ; RunWait, nircmd savescreenshot C:\PrScr.png,, Hide ; FileGetTime, OutputVar, C:\PrScr.png, C ; FileMove C:\PrScr.png, C:\camera\ss_%OutputVar%.png ; return ^!+e:: ; Команда NEXT для WinAmp'а / KMPlayer'а / Kararoke Critical KeyWait, e KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, ^n } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им PostMessage, 0x111, 40048,,, ahk_class Winamp v1.x ; следующий трек } Else { PostMessage, 0x111, 40048,,, ahk_class RRWinamp ; следующий трек } } return ^!+f:: ; Команда PREV для WinAmp'а / KMPlayer'а / Karaoke Critical KeyWait, f KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, ^p } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им PostMessage, 0x111, 40044,,, ahk_class Winamp v1.x ; предыдущий трек } Else { PostMessage, 0x111, 40044,,, ahk_class RRWinamp ; предыдущий трек } } return ^!+h:: ; Команда PLAY/PAUSE для WinAmp'а / KMPlayer'а / Karaoke Critical KeyWait, h KeyWait, Shift KeyWait, Alt KeyWait, Control IfWinExist, %karaoke% { ; Нашли активный karaoke player WinActivate Send, {Space} } Else { IfWinExist, ahk_class Winamp v1.x { ; Нашли активный KMPlayer - управляем им ; DoubleClick в окно проигрывателя - Play|Pause WinActivate Send, {Space} ; SendMessage, 0x400,, 104,, ahk_class Winamp v1.x ; проверка воспроизведения ; If ErrorLevel = 0 ; если не воспроизводится, то... ; PostMessage, 0x111, 40045,,, ahk_class Winamp v1.x ; включить воспроизведение ; Else ; если воспроизводится, то... ; PostMessage, 0x111, 40046,,, ahk_class Winamp v1.x ; поставить на паузу } Else { 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'а день/ночь Critical KeyWait, i KeyWait, Shift KeyWait, Alt KeyWait, Control if(!day) { Send, ^!1 day := 1 } else { Send, ^!2 day := 0 } return ^!+k:: ; Показывать или не показывать экранную клавиатуру Critical KeyWait, k KeyWait, Shift KeyWait, Alt KeyWait, Control Process, Exist, RoadRunner.exe If (ErrorLevel != 0) { ; Если запущен RR, то клавиатура нам нужна только для Fennec'а IfWinActive, Fennec { Gosub doSK } } Else { Gosub doSK } return
Последний раз редактировалось ashu; 03.05.2009 в 23:00.
С уважением, Алексей
Мой Prius NHW11
2 ashu
Трабл вот в чем - функциональность полного варианта для меня избыточна. Реальная потребность в - пробочной инфе, индикации подключения к нету, копировании файлов CG на съемный носитель (и отключении съемного носителя нажатием на кнопку скина).
Несмотря на подробные комментарии, дилетанту корректно поправить скрипт довольно трудно. Как пример, кусок кода:
Вроде, понятно - караоке. Движемся дальше :PHP код:
ShowHideKaraoke:
IfWinExist, ahk_class vanBascoPlayerClass
{
If (KarShow <> 1)
{
WinShow, avc_control.ahk
KarShow := 1
}
WinGetTitle, KarTitle, ahk_class vanBascoPlayerClass
if (karperv <> KarTitle)
{
karprev := KarTitle
StringReplace, KarTitle, KarTitle, %kardel%, , All
StringReplace, KarTitle, KarTitle, _, %A_Space%, All
StringReplace, KarTitle, KarTitle, =, `r`n, All
GuiControl, Text, MyRed, %KarTitle%
}
}
Else
{
If (KarShow = 1)
{
WinHide, avc_control.ahk
KarShow = 0
}
}
return
Ну, вроде бы выясняем "что это было?!" - караоке ли, просто ли винамп и чего делать дальше...PHP код:
StartWinAmp:
IfWinNotExist, %karaoke%
{
; Не нашли активного karaoke player'а
IfWinNotExist, ahk_class Winamp v1.x
{
; Не нашли активного KMPlayer'а
; Работаем с WinAmpом - запускаем проигрывание музыки
SendMessage, 0x400,, 104,, ahk_class %winampid% ; проверка воспроизведения
If ErrorLevel = 0 ; если не воспроизводится, то...
PostMessage, 0x111, 40045,,, ahk_class %winampid% ; включить воспроизведение
}
}
Однако ж следом безо всякого китайского предупреждения -
При чем там интернет, при чем CamGrabber?.. (кстати, у меня нет даже уверенности, что разбиение на смысловые блоки я здесь правильно сделал, не говоря уже о синтаксисе...)PHP код:
; наверняка было выключение, поэтому проверяем подключение к Инету
; инициируем новый цикл проверки Интернета через 1 секунду
If (oncheckonline <> 1)
SetTimer, CheckInternet, -1000, -1
Process, Exist, CamGrabber.exe
If (ErrorLevel != 0)
{
CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс
Sleep, 10000
}
М.б. есть смысл соорудить набор из элементарных скриптов, каждый из которых отвечает за отдельную задачу - тогда и автора не станут теребить каждый раз тюнингом под индивидуальные задачи, да и ламерам в этом вопросе проще будет освоить процесс подгонки?
Впрочем и ликбез в этой теме тоже будет безусловно, полезен многим...
Ты привёл в пример старый код скрипта. Сейчас он слегка изменен - последняя версия в посте №65 (и периодически меняется ).
Угу. Процедура StartWinAmp запускается в-основном при первом запуске скрипта, при выходе из сна и если в списке процессов не обнаружен WinAmp. Как бы заодно туда была добавлен вызов проверки подключения к Инету и перезапуск CamGrabber'а (сейчас уже неактуально - CamGrabber последней версии работает стабильно и при выходе из сна не требует перезапуска. Но код не удалил, а закомментировал - фиг знает как он себя будет вести в будущих версиях ).
С уважением, Алексей
Мой Prius NHW11
2 ashu
Но код не удалил, а закомментировалА последние строчки? Выделенное-то зачем? В закомментированных понятно хоть проверяется самочувствие объекта и производится его перезапуск... А тут вдруг "Run, C:\CamGrabber31demo..."PHP код:
; Process, Exist, CamGrabber.exe
; If (ErrorLevel != 0)
; {
; CDSSendMessage("STOP", "CamGrabber") ; Пытаемся завершить процесс
; Sleep, 10000
; }
; Process, Exist, CamGrabber.exe
; If (ErrorLevel != 0)
; {
; RunWait, taskkill.exe /IM CamGrabber.exe /F,, Hide
; Sleep, 2000
; }
; Run, C:\CamGrabber31demo\CamGrabber.exe
Process, Exist, CamGrabber.exe
If (ErrorLevel = 0)
{
[B]Run, C:\CamGrabber31demo\CamGrabber.exe[/B]
}
return
Ну, впрочем, ход мысли понятен, а вот такой еще вопрос: периодически в разных местах скрипта проверяется состояние винампа. Насколько я понимаю, скрипт крутится постоянно циклом, т.е. одной проверки вроде бы достаточно... Другое дело, что она может быть нужна для работы следующего за ней кода, но если период полного цикла не слишком велик, м.б... А главное, в РР винамп является чем-то вроде движка (если я правильно понимаю), и его падение - это падение всего фронт-энда? Силюсь вспомнить прецеденты...
Там проверяется есть ли такой процесс в памяти (camgrabber.exe) и, если нет, то запуск.
Отсутствие винампа не вызывает падения RR. У меня для экономии ресурсов сделано так - если запускается KMPlayer или караоке-плейер, то винамп не останавливается, а вообще выгружается. А по завершению работы KMP или караоке ahk-скрипт заново стартует винамп.
Что до горячих клавиш, то там проверяется какие из плейеров запущены и производится управление более приоритетным.
А вообще, т.к. скрипт постоянно правится, то некоторое количество мусора в коде, конечно, присутствует.
Последний раз редактировалось ashu; 13.04.2009 в 11:52.
С уважением, Алексей
Мой Prius NHW11
2 ashu
Сенкс, стало понятнее...
Тогда еще один вопрос ламера - такая громоздкая конструкция скрипта, в которой собрано все, обусловлена какими-то фундаментальными причинами? И с другой стороны - написание отдельных узкоспециализированных скриптов чему-то противоречит?
Я понимаю, что есть процессы взаимосвязанные (тот же пример с караоке/винампом/КМР), но пробочную инфу развязать с КГ наверное можно безболезненно, как и копирование файлов с наличием интернета?
М.б. я чего-то не догоняю, но кажется логичнее сделать несколько функциональных блоков (пробки+интернет, КГ+копирование файлов+ отстрел флешки, получение субтитров от GPS/OBD, принудительное завершение прог при уходе в спячку+запуск потерянного после нее)...
Оттачивать их по отдельности, чистить код в этом случае не проще?
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)