Синтаксис
Настройка подробно
Общие принципы
Плагины
Приоритеты ловушек
Символ '#' в начале строки означает комментарий
Загрузка плагина:
<PluginName> = load( "<dir\plugin.dll>" [, "<event_type>"]
)
Пример:
Keyboard = load( "Keyboard\Keyboard.dll", "KEY" )
Подгрузить другой файл со скриптом:
include( "<script.scs>" )
Пример:
include( "winamp.scs" )
Описание групп / Hooks (ловушек) / действий:
<GroupName> = group( [<enabled>] ){
<hook_name> = hook( "<event_type>", "<event_id>"
| *, <enabled> [, <continue> [, <priority>]] ){
...
<variable1> = <plugin_name>.<function>( [<params>] )
...
<command>( [<params>] )
...
}
OnHookEnable( <hook_name> ){
...
}
OnHookDisable( <hook_name> ){
...
}
OnGroupEnable(){
...
}
OnGroupDisable(){
...
}
}
Описание:
Вместо <enabled> можно подставить true / enabled или false / disabled
- разрешает / запрещает работу группы / хука
Вместо <continue> можно подставить true/continue или false/stop/break
- продолжать ли цепочку хуков для данного события
<priority> указывает приоритет хука (сначала обрабатывается хук с менбшим
приоритетом), по умолчанию 128
<hook_name> (имя хука) может быть использовано как переменная внутри данного
хука
* в описании хука означает любой ID события
Пример:
Main = Group( Enabled ){
OnGroupEnable(){
PlaySnd.ActionPreset( OnStart )
}
OnGroupDisable(){
PlaySnd.ActionPreset( OnStop )
}
WinampKey = Hook( "KEY", "Ctrl+Alt+W", Enabled, Break
){
EventSend( "AUDIO", "WINAMP" )
}
}
Команды (внутренние действия):
GroupEnable( <group_name> )
GroupDisable( <group_name> )
HookEnable( <group_name>, <hook_name> )
HookDisable( <group_name>, <hook_name> )
HookBreak( <group_name>, <hook_name> )
EventSend( "<event_type>", "<event_id>"
| * [, <param>] )
Break( [<condition>] )
SkipN( [<condition>] )
Skip( N, [<condition>] )
Описание:
N > 0
<condition> (условие) имеет вид:
<переменная или число> <условие> <переменная или
число>
для условия можно использовать символы: < <= > >= =
== <> !=
Внешние функции из плагинов:
Start()
StartManual( "<id>", "<param>" )
StartPreset( <preset_name> )
Stop()
StopManual( "<id>" )
StopPreset( <preset_name> )
ActionPreset( <preset_name> )
ActionManual( "<param1>" [, "<param2>"
[...]] )
Пимечание: ".ActionManual" можно не писать, например
команды
OSD("Test") и OSD.ActionManual("Test") равнозначны.
Допустимые параметры:
* - подставляется текущий ID
"строковое выражение в кавычках"
целое число (например: -3, 0, 1)
переменная
@N - дополнительный параметр, где 0 < N < 4
Пример:
Mixer = Group( Enabled ){
VolumeUp = Hook( "REMOTE", "VOL_UP", Enabled, Break ){
Break( VolumeUp < 0 )
v = SndMixer.ActionPreset( VolumeUp )
OSD.ActionManual( "Vol %d %%", v )
}
}
Настройка подробно
Общие принципы
Скрипты можно редактировать вручную (закладка Script) или с помощью мастера
(закладка Wizard).
Если в скрипте есть ошибки, мастер не доступен до их исправления.
Основной скрипт находится в файле main.scs, другие файлы скриптов могут
быть подключены командой include, например:
include( "remote.scs" )
Каждое событие (event) имеет тип, идентификатор и параметр.
Например нажатие кнопки на дистанционке имеет тип "REMOTE", идентификатор
- название кнопки, параметр - при нажатии 0, при удержании кнопки - номер повтора
и -1 при отпускании. То есть при нажатии кнопки Play на дистанционке мы получим
ряд событий:
REMOTE, PLAY, 0
REMOTE, PLAY, 1
REMOTE, PLAY, 2
REMOTE, PLAY, -1
Чтобы обработать событие нужно настроить ловушку (hook). Ловушка в свою
очередь должна находиться в группе. Группы нужны для того чтобы быстро отключать
несколько ловушек одновременно. Пример:
MyGroup = Group( Enabled ){
MyHook = Hook( "REMOTE", "PLAY", Enabled ){
# здесь могут быть любые действия
}
}
Здесь группа MyGroup включена сразу при запуске скрипта (параметр true). В
ней ловушка MyHook тоже включена сразу (3-й параметр равен Enabled) при включении
группы и реагирует на кнопку PLAY с дистанционки.
Внутри группы могут быть и специальные ловушки реагирующие на включение/выключение
группы или отдельной ловышки:
MyGroup = Group( Enabled ){
OnGroupEnable(){
# выполняется при включении группы, то есть сразу при запуске скрипта, так
как группа включена по умолчанию
}
OnHookEnable(MyHook){
# выполняется при включении ловушки MyHook, то есть сразу после включения
группы, так как ловушка включена по умолчанию
}
MyHook = Hook( "REMOTE", "PLAY", Enabled ){
# здесь могут быть любые действия
}
} # конец группы
Действиями (Actions) могут быть вызовы функций из плагинов (внешние)
или команды условного перехода, включения/выключения групп и ловушек, генерация
события (внутренние). При выполнении действий их результат можно занести
в переменную и далее использовать в качестве параметра в других действиях. При
перехвате события ловушкой параметр события заносится в переменную с именем,
соответствующую имени ловушки. Например:
MyGroup = Group( Enabled ){
MyHook = Hook( "REMOTE", "PLAY", Enabled ){
OSD.ActionManual("Play %d", MyHook)
}
}
При нажатии кнопки Play на дистанционке срабатывает
ловушка MyHook, параметр заносится в переменную MyHook. Далее вызывается действие
из плагина OSD (OnScreenDisplay) и в него передается параметр события (формат
команды ActionManual для плагина OSD см. здесь). На экране
будет появляться окно с надписью "Play 0", "Play 1", "Play
2" и "Play -1" при отпускании кнопки на дистанционке. Используем
несколько переменных:
MyGroup = Group( Enabled){
MyHook = Hook( "REMOTE", "PLAY", Enabled ){
Break(MyHook<>0)
h = Winamp.ActionManual( "GET_HANDLE" )
Skip2( h <> 0 )
e = ExecFile.ActionManual( "C:\Program Files\Winamp\Winamp.exe"
)
Break( e = 0 )
Winamp.ActionManual( "BUTTON1" )
}
}
Здесь действия выполняются только один раз при нажатии на кнопку Play (MyHook=0),
при удержании и отпускании кнопки последовательность действий прерывается командой
Break(MyHook<>0). Далее запрашивается код окна WinAMP и если h<>0
(WinAMP запущен), следующие 2 строки пропускаются командой Skip2(h<>0).
Если WinAMP не запущен, в переменную h заносится 0, команда Skip2 игнорируется
и через плагин ExecFile запускается WinAMP. Если
путь правильный и запуск удался, в переменную e заносится 1, иначе 0. Если запуск
не удался, последовательность действий прерывается командой Break(e=0). Если
WinAMP уже был запущен или не был, но удачно запустился, последней строкой в
WinAMP включается воспроизведение (BUTTON1 соответствует кнопке Play, подробнее
см. здесь).
Плагины
Прежде чем использовать плагины, их нужно загрузить командой Load. Эта
команда может быть где угодно в тексте скрипта, но обязательно до использования
данного плагина (лучше всего в первых строках). Например:
ExecFile = Load( "ExecFile\ExecFile.dll" )
Далее имя ExecFile может использоваться для вызова функций плагина (см. предыдущий
пример).
Чтобы плагин начал генерировать события, его нужно не только загрузить,
но и запустить. Для этого используются функции Start, StartManual
или StartPreset. В разных плагинах могут быть доступны разные комбинации
этих функций. Например для клавиатуры доступна
только функция Start:
Keyboard.Start()
Функция StartPreset доступна только для плагина WinMon,
для этого плагина в закладке Plugins нужно настроить Event Preset,
то есть указать программы/окна за которыми будет следить WinMon и генерировать
соответствующие события. Например:
WinMon.StartPreset("WINAMP")
В данном случае "WINAMP" - это название настройки, которую нужно
задать в Event Preset Setup на закладке Plugins. Функция StartManual
доступна для таймера.
Запускать плагины удобно из специальной ловушки OnGroupEnable внутри включенной
по умолчанию группы, например:
AlwaysKeyMouse = group( Enabled) {
OnGroupEnable(){
Keyboard.Start()
}
}
На закладке Plugins есть три закладки: Plugin, Events и Actions,
на которых соответственно есть кнопки Plugin Setup, Event Preset Setup и
Action Preset Setup.
Plugin Setup позволяет настроить общие свойства выбранного слева
в списке плагина.
Event Preset Setup и Action Preset Setup позволяют задать параметры
для функций StartPreset и ActionPreset. В скрипте нужно указать название
настройки (preset) и перезагрузить скрипт (),
после чего в списке Presets на соответствующей закладке появляется это
название и оно становится доступно для настройки. Например, если добавить в
какую-нибудь ловушку действие:
OSD.ActionPreset("MyText")
и перезагрузить скрипт, в закладке Actions для MyText будет доступен
Action Preset Setup, где можно задать шрифт, цвет и пр.
Приоритеты ловушек
При описании ловушки указывается не только включена ли она по умолчанию (3-й
по счету параметр), но и продолжать ли обрабатывать данное событие (4-й по счету
параметр), в случае если на него настроено несколько ловушек. Если запретить
дальнейшую обработку, нужно указать приоритет данной ловушки (5-й по счету параметр).
По умолчанию приоритет 128. Например:
MyGroup = Group( Enabled){
MyHook1 = Hook( "REMOTE", "PAUSE", Enabled ){
OSD.ActionManual( "Pause OK" )
}
MyHook2 = Hook( "REMOTE", "PAUSE", Disabled, Break, 20
){
}
MyHook3 = Hook( "REMOTE", "PLAY", Enabled ){
HookEnable(MyGroup, MyHook2)
}
MyHook4 = Hook( "REMOTE", "STOP", Enabled ){
HookDisable(MyGroup, MyHook2)
}
}
При запуске скрипта ловушка MyHook2 выключена. При нажатии на дистанционке
кнопки Pause, будет отображаться надпись "Pause OK". После нажатия
кнопки Play включится ловушка MyHook2. У нее приоритет 20, то есть меньше чем
у MyHook1 (по умолчанию 128), поэтому она обрабатывается раньше. В ней нет никаких
действий, за то указано запретить дальнейшую обработку события другими ловушками
(4-й параметр равен Break). Таким образом при нажатии кнопки Pause ловушка MyHook1
уже не будет срабатывать, хотя и останется включенной. При нажатии на дистанционке
кнопки Stop сработает ловушка MyHook4 и выключит ловушку MyHook2. После этого
ловушка MyHook1 снова начнет реагировать на кнопку Pause. По этому принципу
реализован режим HOLD в скрипте remote.scs
|