Нда... В опчем Ж. Спасибо!
Нда... В опчем Ж. Спасибо!
Не расстраивайся, дорогой. Я уже почитал документацию... Завтра напишу для тебяСообщение от Parador
Демка заработала - показывает возраст пробок в окне СитиГида, если оно активно. Осталось прикрутить её к существующему скрипту... Но это уже точно не сегодня
Последний раз редактировалось ashu; 24.11.2008 в 03:07.
С уважением, Алексей
Мой Prius NHW11
Очередная версия (предыдущая содержала ошибки - удалена)
Скрипт к предыдущему функционалу получил теперь умения:
- поддерживать интернет-соединение
- показывать "возраст" файла пробок СитиГида
- СитиГид запускается сразу с включенным GPS
- нормальная обработка ошибок подключения к Интернету
- нормальная обработка ошибки WinAmp'а из-за долгой инициализации звуковой usb-карты
В скине РоадРаннера:
- переменная $OnlineStatus$ показывает статус подключения в Интернету (проверяется пингом);
- переменная $OnlineSwitch$ показывает состояние переключателя "поддерживать соединение с Интернетом или нет";
- переменная $MYJAMG$ показывает "возраст" пробочного файла СитиГида зеленым цветом;
- переменная $MYJAMR$ показывает "возраст" пробочного файла СитиГида красным цветом (предполагается, что координаты надписи будут такими же, как и у $MYJAMG$; пример см. ниже).
Для включения/отключения/переключения поддержателя соединения с Интернетом из RR надо дать команду (например, повесить это на отдельную кнопку):
SENDMSG;avc_control.ahk;online - поддерживать соединение
SENDMSG;avc_control.ahk;offline - не поддерживать соединение (при получении команды соединение разрывается)
SENDMSG;avc_control.ahk;switch - поменять состояние поддерживать/не поддерживать
avc_control.ahk:
Пример показа СитиГида в скине DigitalFX 3.0 через External_GPS.skin:Код:#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 := "www.relcom.ru" ; кого мучаем пингами в первую очередь (www.relcom.ru) pinghost2 := "www.ru" ; кого мучаем пингами во вторую очередь (www.ru) onlinestr := "В сети" ; сообщение "Online" на экране (переменная RR OnlineStatus) offlinestr := "---" ; сообщение "Offline" на экране chkonline := "+ +" ; сообщение "постоянное подключение" на экране pstripwin := "Меры предосторожности" ; название стартового окна восстановления PowerStrip'а svhostwin := "svchost.exe - Ошибка приложения" ; название окна ошибки службы (вероятнее всего служба Windows Audio) winamperror := "NullSoft DirectSound output" ; название окна винампа с ошибкой звукового устройства checkperiod := 40 ; через сколько секунд (примерно) запускаем процедуру проверки сети и пробок СитиГида myjamfile := "C:\Program Files\City Guide\78SPb.jam" ; за каким файлом пробок следим (боевой) ;myjamfile := "C:\CityGuide\City Guide 2.2\78SPb.jam" ; за каким файлом пробок следим (тестовый) jamgreen := 8 ; до скольки минут считать возраст пробок зеленым jamred := 40 ; до скольки минут считать возраст пробок красным empty := "нет" ; что пишем на экране, если пробочный файл очень старый ; -------- конец редактируемых переменных - настроек ---------- WinAmpActive := 0 CityGuideActive := 0 day := 1 online := 0 setoffline := 0 oncheckonline := 0 Lastcheck := 0 checkperiod := - checkperiod * 1000 ; Создаем пустое окно и сразу его прячем. Окно необходимо для получения команд управления от RR Gui, Show WinHide, avc_control.ahk ; Устанавливаем обработчик для приёма команд через WM_COPYDATA от RR OnMessage(0x4A, "OnCopyData") SetTimer, CheckWarnings, -1000 SetTimer, CheckInternet, %checkperiod%, -1 ; периодическая проверка подключения к Интернету (с пониженным приоритетом) StartWinAmp: SendMessage, 0x400,, 104,, ahk_class %winampid% ; проверка воспроизведения If ErrorLevel = 0 ; если не воспроизводится, то... PostMessage, 0x111, 40045,,, ahk_class %winampid% ; включить воспроизведение ; наверняка было выключение, поэтому проверяем подключение к Инету ; инициируем новый цикл проверки Интернета через 1 секунду If (oncheckonline <> 1) SetTimer, CheckInternet, -1000, -1 return CheckWarnings: ; Обработчик варнингов If WinAmpActive = 0 { IfWinExist, ahk_class %winampid% { ; WinAmp не был запущен, а сейчас найден в списке окон Gosub StartWinAmp WinAmpActive := 1 } } Else { IfWinNotExist, ahk_class %winampid% { WinAmpActive := 0 } Else { If (Lastcheck + 30000 < A_TickCount) { ; WinAmp был запущен и существует до сих пор, но ; давно не было проверок, возможно, работа останавливалась SetTimer, StartWinAmp, -1000 } } } If CityGuideActive = 0 { IfWinExist, %cityguide% { ; CityGuide не был запущен, а сейчас найден в списке окон WinActivate Send, 5 ; включить GPS CityGuideActive := 1 } } Else { IfWinNotExist, %cityguide% { CityGuideActive := 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 } Lastcheck := A_TickCount SetTimer, CheckWarnings, On return RestartAudio: RunWait, net stop AudioSrv,, Hide RunWait, net start AudioSrv,, Hide return CheckInternet: ; Обработчик интернет-проверок If(oncheckonline = 1) return Else oncheckonline := 1 If (setoffline = 1) Gosub DoOffline Gosub DoOnline ; Получаем время файла пробок 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 + 5 < 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) } SetTimer, CheckInternet, %checkperiod%, -1 oncheckonline := 0 return ; конец процедуры CheckInternet DoOffline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") setoffline := 0 RunWait, rasdial %myconnection% /DISCONNECT,, Hide SendToRR("SETVAR;OnlineStatus;" . offlinestr) return DoOnline: If (online = 1) SendToRR("SETVAR;OnlineSwitch;" . chkonline) Else SendToRR("SETVAR;OnlineSwitch") Loop, 5 ; предпринимаем 5 попыток подключиться { RunWait, ping -n 3 -f -w 2000 %pinghost1%,, UseErrorLevel|Hide If (ErrorLevel = 0) { SendToRR("SETVAR;OnlineStatus;" . onlinestr) Break } Else { If (online = 1) Sleep, 5000 RunWait, ping -n 3 -f -w 2000 %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 RunWait, C:\Tools\usr.exe stop -n "%btapapter%",, Hide 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="") { len := StrLen(msg) port := 1 ; RR слушает команды, приходящие на порт 1 VarSetCapacity(CopyDataStruct, 12, 0) NumPut(port, CopyDataStruct, 0) NumPut(len, CopyDataStruct, 4) ; тут именно len, а не len+1 как пишут в некоторых примерах NumPut(&msg, CopyDataStruct, 8) SendMessage, 0x4A,, &CopyDataStruct,, RoadRunner } ; Далее - обычные реакции на хоткеи ^!+c::^!5 ; AutoHide для указателя мышки ^!+b::Click right ; имитация правой кнопки мышки ^!+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:: ; Команда NEXT для WinAmp'а PostMessage, 0x111, 40048,,, ahk_class RRWinamp ; следующий трек return ^!+f:: ; Команда PREV для WinAmp'а PostMessage, 0x111, 40044,,, ahk_class RRWinamp ; предыдущий трек return ^!+h:: ; Команда PLAY/PAUSE для WinAmp'а 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 day := 1 } else { Send, ^!2 day := 0 } return
Содержимое DFX_Font_Color.txt:Код:RoadRunner Skin RRScreen CityGuide IGUIDANCE_OFF.png,IGUIDANCE_OFF.png,IGUIDANCE_ON.png,IGUIDANCE_OFF.png INC,DFX_Font_Color.txt /, L, x, y, w, h, color R;RGB, G, B, font size;FONT, font name, Code;LABELCODES, Tooltip;LABELALIGNMENT L,2,94,71,41,#DFX1R#,#DFX1G#,#DFX1B#,24,"Arial","GPSALT","CENTER" L,8,402,36,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Sat:","RIGHT" L,6,504,75,17,#DFX2R#,#DFX2G#,#DFX2B#,8,"Arial","=$OnLineSwitch$","LEFT" L,0,503,75,17,#DFX1R#,#DFX1G#,#DFX1B#,10,"Arial","=$OnLineStatus$","CENTER" L,45,402,33,26,#DFX1R#,#DFX1G#,#DFX1B#,16,"Arial","GPSSAT","LEFT" L,0,468,75,26,#DFX1R#,#DFX1G#,#DFX1B#,24,"Arial:B","=$MYJAMG$","CENTER" L,0,466,75,26,#DFX2R#,#DFX2G#,#DFX2B#,26,"Arial:B","=$MYJAMR$","CENTER" L,0,549,75,26,#DFX1R#,#DFX1G#,#DFX1B#,17,"Arial","=MENU","CENTER" L,0,266,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=ExtPos","CENTER" L,0,193,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=CurPos","CENTER" L,0,237,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Mem","CENTER" L,0,165,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Mem","CENTER" L,0,313,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Toggle","CENTER" L,0,339,75,26,#DFX1R#,#DFX1G#,#DFX1B#,15,"Arial","=Track","CENTER" L,1,6,72,59,#DFX1R#,#DFX1G#,#DFX1B#,36,"Arial:B","GPSSPD","CENTER" /, B, x, y, w, h, Command;COMMANDCODES, Tooltip B,1,229,73,73,"LOCOSK", B,0,302,73,73,"ACTIVATE;City Guide||SENDKEY;^t", B,0,375,75,74,"SENDMSG;CamGrabber;SAVE","" B,-1,451,75,74,"SENDMSG;avc_control.ahk;switch","" B,1,523,75,74,"MAIN","" B,0,150,75,75,"LOC", /, A, x, y, w, h, color R;RGB, G, B A,77,1,724,599,,, END
Код:/DEFINE DFX1R 3 /DEFINE DFX1G 255 /DEFINE DFX1B 5 /DEFINE DFX2R 255 /DEFINE DFX2G 3 /DEFINE DFX2B 5
Последний раз редактировалось ashu; 30.11.2008 в 00:02.
С уважением, Алексей
Мой Prius NHW11
Алексей, спасибо, см. личку.
Честно говоря, ожидал там увидеть скриншот именно с компа из машинки - чтобы понять куда лучше размещать индикатор... Ладно, эт мелочи, потом сам подредактируешь позицию на экранеСообщение от Parador
Правда, в ближайшие пару дней со временем ожидается напряг... За выходные уж точно должно найтись время
Кста, личка у тебя переполнена, поэтому пришлось сюда написать.
С уважением, Алексей
Мой Prius NHW11
Спасибо! Буду ждать. Лицо почистил.Сообщение от ashu
ЗЫ. Мне было бы удобно по правому борту между средней и верхней кнопками.
Последний раз редактировалось Parador; 28.11.2008 в 00:35.
Ну, что-то, вроде, получилосьСообщение от Parador
Делал под 800x480. Если чего не так - сорцы открыты Можно, например, недостающий функционал перетащить из моего avc_control.ahk.
В общем, ниже представлен обрезанный вариант моего скрипта avc_control.ahk для Parador'а и других, кто в силу обстоятельств не пользуется RoadRunner'ом.
Скрипт умеет только:
1. В только что запущенный СитиГид посылать "5" - включение GPS.
2. Показывать поверх окна СитиГида "возраст" пробочного файла. Окно СитиГида при этом должно быть активным.
cityguide-is.ahk:
Код:#NoTrayIcon ; не отображать значок скрипта в трее #SingleInstance force ; перезагрузить скрипт, если он уже запущен #NoEnv ; запрещаем имена переменных как у переменных окружения SendMode Input ; ускорренный ввод #Persistent ; держать скрипт запущенным SetTitleMatchMode 2 ; 2 - заголовок окна должен содержать значение, заданное в параметре ; ----------- редактируемые переменные - настройки ------------ cityguide := "City Guide" ; название окна CityGuide myjamfile := "C:\Program Files\City Guide\78SPb.jam" ; за каким файлом пробок следим (боевой) ;myjamfile := "C:\CityGuide\City Guide 2.2\78SPb.jam" ; за каким файлом пробок следим (тестовый) jamgreen := 8 ; до скольки минут считать возраст пробок зеленым jamred := 40 ; до скольки минут считать возраст пробок красным empty := "НЕТ" ; что пишем на экране, если пробочный файл очень старый xPosition := 670 ; x-позиция на экране yPosition := 105 ; y-позиция на экране ; -------- конец редактируемых переменных - настроек ---------- CityGuideActive := 0 Custom1Color := "600305" Custom2Color := "036005" MyTextEmpty := "" gui, color, 000000 gui, font, s48 bold, Arial Gui, Add, Text, c%Custom1Color% x200 y200 w130 h70 vMyRed, %MyText3% Gui, Add, Text, c%Custom2Color% x0 y0 w130 h70 vMyGreen, %MyText1% Gui, +LastFound +AlwaysOnTop WinSet, TransColor, 000000 200 Gui, -Caption Gui, Show, x%xPosition% y%yPosition% w130 h70 NoActivate, CGJAM JamShow := 1 SetTimer, ShowHideJam ; отслеживать показ на экране только в окне СитиГида SetTimer, SwitchText, 10000 ; проверять файл пробок каждые 10 секунд return GuiSize: If (Errorlevel = 1) Gui, Restore ; противодействуем минимизации окна ShowHideJam: Act := 0 IfWinActive, %cityguide% { Act := 1 } Else { IfWinActive, CGJAM { Act := 1 } } If (Act = 1) { If (JamShow <> 1) { WinShow, CGJAM JamShow := 1 } } Else { If (JamShow = 1) { WinHide, CGJAM JamShow = 0 } } If CityGuideActive = 0 { IfWinExist, %cityguide% { ; CityGuide не был запущен, а сейчас найден в списке окон WinActivate Send, 5 ; включить GPS CityGuideActive := 1 } } Else { IfWinNotExist, %cityguide% { CityGuideActive := 0 } } return SwitchText: ; Получаем время файла пробок 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 + 5 < lastjamtimestamp) currconntimestamp := currconntimestamp + 24*60 ; Получаем возраст файла пробок jamtime := currconntimestamp - lastjamtimestamp If (jamtime > 9) { jamtime := " " . jamtime } Else { jamtime := " " . jamtime } jamexpired := 0 If (currconntimestamp > lastjamtimestamp + jamgreen) jamexpired := 1 If (currconntimestamp > lastjamtimestamp + jamred) jamtime := empty ; тут надо нарисовать цветом возраст пробочного файла If (jamexpired = 0) { ; Делаем зеленым GuiControl, Move, MyRed, x200 y200 ; сдвигать надо, чтобы красный текст не исчезал при показе GuiControl, Text, MyRed, %MyTextEmpty% GuiControl, Text, MyGreen, %jamtime% GuiControl, Move, MyGreen, x0 y0 } Else { ; Делаем красным GuiControl, Move, MyGreen, x200 y200 ; сдвигать надо, чтобы красный текст не исчезал при показе GuiControl, Text, MyGreen, %MyTextEmpty% GuiControl, Text, MyRed, %jamtime% GuiControl, Move, MyRed, x0 y0 } return
Последний раз редактировалось ashu; 30.11.2008 в 00:13.
С уважением, Алексей
Мой Prius NHW11
Блин, Алексей, не издевайся! Куда засовывать-то?
И еще. Если у меня ЖПС подключен всегда, "5" не помешает?
Последний раз редактировалось Parador; 30.11.2008 в 00:22.
У меня засунуто в автозапуск.Сообщение от Parador
Чтобы работало, у тебя должен быть проинсталлирован AutoHotKey
С уважением, Алексей
Мой Prius NHW11
Отвечу сюда - вдруг еще кому будет интересно
Я положил прямо в папку "Автозапуск". Если в системе установлен AutoHotKey, то скрипты исполняются как бинарники.Сообщение от Parador
Местоположение надписи управляется переменными xPosition и yPosition - посмотри шапку скрипта - я туда перенёс все нужные переменные и насколько смог их прокомментировал.
Вообще, скрипт можно скомпилировать в exe'шник, тогда не нужно инсталлировать в автомобильный комп AutoHotKey, но нескомпиллированный скрипт тем хорош, что ты можешь менять его прямо на ходу - чуть-чуть подправил и уже видишь результаты изменений (скрипт при этом надо запустить по-новой, старый при этом выгрузится).
У меня тож раньше СитиГид сам дозванивался... Но были 2 проблемы:Сообщение от Parador
1. Если probki.net лежит/не отвечает, то СГ считает это ошибкой подключения и разрывает соединение. Т.е. нельзя определить проблема ли это оператора (нет соединения с Инетом) или это опять probki.net дурят.
2. Т.к. процесс подключения мной не контролируется, то и невозможно автоматизировать процесс вытыкания/втыкания usb-адаптера bluetooth. Пытался сначала делать через чтения на ходу логов СитиГида (History.txt), но натолкнулся на пачку других проблем, в том числе проблем, вытекающих из п.1.
Собственно, поэтому и отдал процесс подключения/отключения к Инету своему скрипту - он пытается 4 раза подключиться к Инету и после каждого раза пингами проверяет факт подключения. Если за 4 раза подключиться не удалось, то считаем, что проблема в адаптере и пытаемся его отключить и подключить снова.
Вот...
Можешь сделать у себя в IS доп-кнопочку, вызывающую запуск батника, в котором пропиши команды отключения и повторного включения твоего usb-модема - будешь в случае проблем с соединением просто тыкать в это кнопочку.
Тут есть на русском: http://www.script-coding.info/AutoHo...anslation.htmlСообщение от Parador
С уважением, Алексей
Мой Prius NHW11
Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)