Показать сообщение отдельно
Старый 20.11.2008, 18:34   #31
ashu
Старший Пользователь
 
Аватар для ashu
 
Регистрация: 25.11.2007
Возраст: 51
Город: СПб, Гондурас
Регион: 78, 98
Машина: Toyota Prius 11S выпуска 2001/09
Сообщений: 766
ashu has a spectacular aura aboutashu has a spectacular aura about
По умолчанию

Ahk-скрипт переписал.

Скрипт к предыдущему функционалу получил теперь умения:
- поддерживать интернет-соединение
- показывать "возраст" файла пробок СитиГида
- СитиГид запускается сразу с включенным 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:
Код:
#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 < 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
Пример показа СитиГида в скине DigitalFX 3.0 через External_GPS.skin:
Код:
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
Содержимое DFX_Font_Color.txt:
Код:
/DEFINE DFX1R 3
/DEFINE DFX1G 255
/DEFINE DFX1B 5
/DEFINE DFX2R 255
/DEFINE DFX2G 3
/DEFINE DFX2B 5
__________________
Мой Toyota Prius NHW11

Последний раз редактировалось ashu; 26.11.2008 в 12:38.
ashu вне форума   Ответить с цитированием