Синтаксис

Настройка подробно

Общие принципы
Плагины
Приоритеты ловушек


Символ '#' в начале строки означает комментарий

Загрузка плагина:
<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