Страница 7 из 13 ПерваяПервая 12345678910111213 ПоследняяПоследняя
Показано с 61 по 70 из 126
  1. #61
    Пользователь
    Регистрация
    26.04.2008
    Возраст
    59
    Сообщений
    67
    Вес репутации
    209

    По умолчанию Re: Примеры ahk-скриптов

    С вашей помощью

  2. #62
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    574

    По умолчанию Re: Примеры ahk-скриптов

    Последняя версия, с которой сейчас езжу

    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

  3. #63
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    574

    По умолчанию Re: Примеры ahk-скриптов

    Поставил себе в карписю караоке от 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

  4. #64
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    574

    По умолчанию Если надо что-то часто копировать

    Если надо часто совершать какие-то единообразные операции копирования иль перемещения файлов (например, сгружать на флешку снятое CamGrabber'ом видео с маршрутной камеры иль заливать новые музыкальные или видеофайлы), то можно этот процесс слегка автоматизировать при помощи того же autohotkey.



    Пример для встраивания в ваш скрипт:
    Код:
    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
    Процедура VideoMove из данного примера производит перенос файлов по маске C:\camera\*.* на флешку в каталог G:\camera. Если такого каталога обнаружить не удалось, производится попытка произвести перенос файлов в альтернативный каталог F:\camera. Если и такого каталога не найдено, выдается предупреждение и работа завершается.
    Если каталог назначения найден, рисуется progress процесса переноса.

    Процедуру можно вызывать по удобному вам событию - по нажатию горячей клавиши, по таймеру, по сообщению, посланному через WM_COPY, иль каким-нибудь другим образом.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	progress.png 
Просмотров:	3637 
Размер:	47.5 Кб 
ID:	3458  
    Последний раз редактировалось ashu; 30.03.2009 в 18:29.
    С уважением, Алексей
    Мой Prius NHW11

  5. #65
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    574

    По умолчанию Re: Примеры ahk-скриптов

    Я в своём скрипте 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

  6. #66
    Продвинутый Аватар для Pinin
    Регистрация
    04.01.2009
    Возраст
    59
    Сообщений
    213
    Вес репутации
    230

    По умолчанию Re: Примеры ahk-скриптов

    2 ashu

    Трабл вот в чем - функциональность полного варианта для меня избыточна. Реальная потребность в - пробочной инфе, индикации подключения к нету, копировании файлов CG на съемный носитель (и отключении съемного носителя нажатием на кнопку скина).

    Несмотря на подробные комментарии, дилетанту корректно поправить скрипт довольно трудно. Как пример, кусок кода:

    PHP код:
    ShowHideKaraoke:
        
    IfWinExistahk_class vanBascoPlayerClass
        
    {
            If (
    KarShow <> 1)
            {
                
    WinShowavc_control.ahk
                KarShow 
    := 1
            
    }
            
    WinGetTitleKarTitleahk_class vanBascoPlayerClass
            
    if (karperv <> KarTitle)
            {
                
    karprev := KarTitle
                StringReplace
    KarTitleKarTitle, %kardel%, , All
                StringReplace
    KarTitleKarTitle_, %A_Space%, All
                StringReplace
    KarTitleKarTitle, =, `r`nAll
                GuiControl
    TextMyRed, %KarTitle%
            }
        }
        Else
        {
            If (
    KarShow 1)
            {
                
    WinHideavc_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 если не воспроизводитсято...
                    
    PostMessage0x11140045,,, ahk_class %winampid% ; включить воспроизведение
            
    }
        } 
    Ну, вроде бы выясняем "что это было?!" - караоке ли, просто ли винамп и чего делать дальше...
    Однако ж следом безо всякого китайского предупреждения -

    PHP код:
    наверняка было выключениепоэтому проверяем подключение к Инету
    инициируем новый цикл проверки Интернета через 1 секунду
        
    If (oncheckonline <> 1)
            
    SetTimerCheckInternet, -1000, -1
        Process
    ExistCamGrabber.exe
        
    If (ErrorLevel != 0)
        {
            
    CDSSendMessage("STOP""CamGrabber") ; Пытаемся завершить процесс
            Sleep
    10000
        

    При чем там интернет, при чем CamGrabber?.. (кстати, у меня нет даже уверенности, что разбиение на смысловые блоки я здесь правильно сделал, не говоря уже о синтаксисе...)

    М.б. есть смысл соорудить набор из элементарных скриптов, каждый из которых отвечает за отдельную задачу - тогда и автора не станут теребить каждый раз тюнингом под индивидуальные задачи, да и ламерам в этом вопросе проще будет освоить процесс подгонки?

    Впрочем и ликбез в этой теме тоже будет безусловно, полезен многим...

  7. #67
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    574

    По умолчанию Re: Примеры ahk-скриптов

    Ты привёл в пример старый код скрипта. Сейчас он слегка изменен - последняя версия в посте №65 (и периодически меняется ).

    Цитата Сообщение от Pinin Посмотреть сообщение
    Однако ж следом безо всякого китайского предупреждения -

    При чем там интернет, при чем CamGrabber?..

    Угу. Процедура StartWinAmp запускается в-основном при первом запуске скрипта, при выходе из сна и если в списке процессов не обнаружен WinAmp. Как бы заодно туда была добавлен вызов проверки подключения к Инету и перезапуск CamGrabber'а (сейчас уже неактуально - CamGrabber последней версии работает стабильно и при выходе из сна не требует перезапуска. Но код не удалил, а закомментировал - фиг знает как он себя будет вести в будущих версиях ).
    С уважением, Алексей
    Мой Prius NHW11

  8. #68
    Продвинутый Аватар для Pinin
    Регистрация
    04.01.2009
    Возраст
    59
    Сообщений
    213
    Вес репутации
    230

    По умолчанию Re: Примеры ahk-скриптов

    2 ashu

    Но код не удалил, а закомментировал
    PHP код:
    ;    ProcessExistCamGrabber.exe
    ;    If (ErrorLevel != 0)
    ;    {
    ;        
    CDSSendMessage("STOP""CamGrabber") ; Пытаемся завершить процесс
    ;        Sleep10000
    ;    }
    ;    
    ProcessExistCamGrabber.exe
    ;    If (ErrorLevel != 0)
    ;    {
    ;        
    RunWaittaskkill.exe /IM CamGrabber.exe /F,, Hide
    ;        Sleep2000
    ;    }
    ;    
    RunC:\CamGrabber31demo\CamGrabber.exe

        Process
    ExistCamGrabber.exe
        
    If (ErrorLevel 0)
        {
            [
    B]RunC:\CamGrabber31demo\CamGrabber.exe[/B]
        }
        return 
    А последние строчки? Выделенное-то зачем? В закомментированных понятно хоть проверяется самочувствие объекта и производится его перезапуск... А тут вдруг "Run, C:\CamGrabber31demo..."
    Ну, впрочем, ход мысли понятен, а вот такой еще вопрос: периодически в разных местах скрипта проверяется состояние винампа. Насколько я понимаю, скрипт крутится постоянно циклом, т.е. одной проверки вроде бы достаточно... Другое дело, что она может быть нужна для работы следующего за ней кода, но если период полного цикла не слишком велик, м.б... А главное, в РР винамп является чем-то вроде движка (если я правильно понимаю), и его падение - это падение всего фронт-энда? Силюсь вспомнить прецеденты...

  9. #69
    Гуру Аватар для ashu
    Регистрация
    29.01.2008
    Возраст
    51
    Сообщений
    1,161
    Вес репутации
    574

    По умолчанию Re: Примеры ahk-скриптов

    Цитата Сообщение от Pinin Посмотреть сообщение
    А последние строчки? Выделенное-то зачем?
    Там проверяется есть ли такой процесс в памяти (camgrabber.exe) и, если нет, то запуск.

    Цитата Сообщение от Pinin Посмотреть сообщение
    периодически в разных местах скрипта проверяется состояние винампа. Насколько я понимаю, скрипт крутится постоянно циклом, т.е. одной проверки вроде бы достаточно... Другое дело, что она может быть нужна для работы следующего за ней кода, но если период полного цикла не слишком велик, м.б... А главное, в РР винамп является чем-то вроде движка (если я правильно понимаю), и его падение - это падение всего фронт-энда? Силюсь вспомнить прецеденты...
    Отсутствие винампа не вызывает падения RR. У меня для экономии ресурсов сделано так - если запускается KMPlayer или караоке-плейер, то винамп не останавливается, а вообще выгружается. А по завершению работы KMP или караоке ahk-скрипт заново стартует винамп.
    Что до горячих клавиш, то там проверяется какие из плейеров запущены и производится управление более приоритетным.

    А вообще, т.к. скрипт постоянно правится, то некоторое количество мусора в коде, конечно, присутствует.
    Последний раз редактировалось ashu; 13.04.2009 в 11:52.
    С уважением, Алексей
    Мой Prius NHW11

  10. #70
    Продвинутый Аватар для Pinin
    Регистрация
    04.01.2009
    Возраст
    59
    Сообщений
    213
    Вес репутации
    230

    По умолчанию Re: Примеры ahk-скриптов

    2 ashu

    Сенкс, стало понятнее...
    Тогда еще один вопрос ламера - такая громоздкая конструкция скрипта, в которой собрано все, обусловлена какими-то фундаментальными причинами? И с другой стороны - написание отдельных узкоспециализированных скриптов чему-то противоречит?

    Я понимаю, что есть процессы взаимосвязанные (тот же пример с караоке/винампом/КМР), но пробочную инфу развязать с КГ наверное можно безболезненно, как и копирование файлов с наличием интернета?
    М.б. я чего-то не догоняю, но кажется логичнее сделать несколько функциональных блоков (пробки+интернет, КГ+копирование файлов+ отстрел флешки, получение субтитров от GPS/OBD, принудительное завершение прог при уходе в спячку+запуск потерянного после нее)...
    Оттачивать их по отдельности, чистить код в этом случае не проще?

Страница 7 из 13 ПерваяПервая 12345678910111213 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •