Автор статьи: Nem (nem-@mail.ru)

ПРИМЕЧАНИЯ сделаны автором программы SlyControl


В этой статье я попытаюсь вам максимально быстро и просто объяснить, как настроить известную программу от автора SlyDiman, под свой пульт управления. И как создать скрипт под свою программу, чтоб SlyControl её понимал, не вдаваясь в подробности различных плагинов.

1. Итак, приступим:
Качаем и устанавливаем саму программу, заходим в неё первый раз, и что мы видим, появляется Мастер настройки, и мы выбираем наш плагин пульта. Тут я думаю, ничего сложного нет, и я покажу пример под свой плагин для ИК порта Tekram Ir210. Под любой другой плагин делается всё практический идентично:


2. Затем жмём кнопку "настройка", и появляется окно, где нам нужно выбрать пульт либо ТВ тюнер, в зависимости от плагина. Если у вас ТВ тюнер то следующий пункт вы можете не читать, а просто выбрать свой Тюнер из списка и нажать кнопку "ОК". А вот если вы сидите по ИК порту то здесь вам надо настроить кнопки на пульте делается это так: Направляем пульт к ИК, жмём нужную кнопку, но надо сделать так чтобы в мониторинге снизу была не короткая а длинная волна, вот такая:


3. Затем нажимаем кнопку "Add->" и задаём название кнопки, осторожно! Надо чтоб кнопки соответствовали требуемой команде, вот список всех нужных команд (остальные я решил не предлагать вам из-за ненадобности) :

"POWER"
"VIDEO"
"AUDIO"
"TV"
"RADIO"
"TELETEXT"
"CD"
"DVD"
"VOL_UP"
"VOL_DOWN"
"MUTE"
"SETUP" (use it for LOOP, REPEAT or RECALL)
"DISPLAY" (use it for MENU)
"SCAN" (use it for A or AUTOSCAN)
"RED"
"YELLOW"
"GREEN"
"BLUE"

"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
"UP"
"DOWN"
"LEFT"
"RIGHT"
"ENTER" (use it for OK)
"CANCEL"
"PLAY"
"PAUSE"
"STOP"
"RECORD"
"CAPTURE"
"ZOOM" (remap from RESIZE or FULLSCREEN)
"FWD" (use it for FF)
"REW" (use it for RW)
"NEXT" (remap from CH_UP)
"PREV" (remap from CH_DOWN)
"SLEEP"

Полный список команд вы можете прочитать здесь:
(Диск):\Program Files\SlyDiman\SlyControl2\Data\std_keys.txt


4. Дальше жмём кнопку "применить", там появиться WinLirc, вам скорее всего он не понадобиться, жмём "применить" дальше. Появляется настройка управления общей громкостью, тоже жмём "применить". Вот появилось очень интересное и нужное окно со скриптами, ставьте все скрипты, которые вам нужны и жмите далее ( и поставьте скрипты для WinAmp 2.x, Windows Media Player 6.4, TVtool и bRadio) . Вот здесь надо быть осторожнее, выставите программы по умолчанию для кнопок ТВ, Видео, Аудио, Радио. Ставьте те которые вам нужны, а если среди них нет нужной выберите любую, я лично расскажу вам на примере первых скриптов чтоб не путать, т.е. вот так:



5. Жмём кнопку "Применить" до конца. Итак, он запустился, но не так как нужно.
Причём я заметил одну ошибку при использовании порта Tekram IR210, неправильно прописан плагин, чтобы это исправить это, жмём на вкладку "Структура" выбираем скрипт RemoteCFG.scs и правим StartRemote и StopRemote, меняем модуль IrDA на IR210, вот так вот:

ПРИМЕЧНИЕ: Да, неувязочка вышла ;-) В последней версии это уже исправлено. Чтобы устранить проблему в корне нужно было в файле
C:\Program Files\SlyDiman\SlyControl2\Data\CfgWizard\remotecfg.scs
заменить IrDA.Start() и IrDA.Stop() на Ir210.Start() и Ir210.Stop()

Итак, исправили. Теперь займёмся скриптами


6. Чтобы SlyControl знал вашу программу надо написать скрипт, делается это очень легко ( я покажу пример с TV из ATI Multimedia Center), нажимаем во вкладке "структура" кнопку новый скрипт:

Набираем в поле "имя файла" название программы, допустим TV:

Нажимаем открыть, нас спрашивают "создать файл TV.scs ?", жмём "Создать".
Теперь у нас появился пустой скрипт во вкладке "скрипт", переходим туда и вставьте вот этот текст в скрипт:

PROG_Always = Group( Enabled ){

OnGroupEnable(){ WinMon.StartPreset( PROG ) }

PROG_Start = Hook( "TV", "PROG", Enabled, Break ){
h = WinMon.ActionPreset( PROG)
Skip( 2, h = 0 )
WinCtrl( "ACTIVATE", h )
Skip( 2 )
e = ExecFile( "c:\ПАПКА\ПРОГРАММА", "ПАРАМЕТР ЗАПУСКАможно стереть" )
Break( e = 0 )
GroupEnable( PROG )
}

PROG_Create = Hook( "WINMON", "PROG_CREATE", Enabled ){
GroupEnable( PROG )
}

PROG_Activate = Hook( "WINMON", "PROG_ACTIVATE", Enabled ){
GroupEnable( PROG )
}

PROG_Close = Hook( "WINMON", "PROG_CLOSE", Enabled ){
GroupDisable( PROG )
}

MediaDisable = Hook( "MMEDIA", "DISABLE", Enabled ){
Break( MediaDisable = 999 )
GroupDisable( PROG )
}

}

#===========================================================

PROG = Group( Disabled ){

OnGroupEnable(){
EventSend( "MMEDIA", "DISABLE", 999 )
OSD( "Apps", "НАЗВАНИЕ ПРОГРАММЫ", "P:CHRISTV.bmp" )
}

MyRemote = Hook( "REMOTE", "ПУЛЬТ", Enabled, Break ){
Break( MyRemote <> 0 )
h = WinMon.ActionPreset( PROG )
break( h = 0 )
# a = WinCtrl( "ISACTIVE", h )
# skip( 1, a <> 0 )
# WinCtrl( "ACTIVATE", h )
Keyboard( "PRESS", "КЛАВИША" )
}

My2Remote = Hook( "REMOTE", "ПУЛЬТ", Enabled, Break ){
Break( My2Remote <> 0 )
h = WinMon.ActionPreset( PROG )
break( h = 0 )
# a = WinCtrl( "ISACTIVE", h )
# skip( 1, a <> 0 )
# WinCtrl( "ACTIVATE", h )
Keyboard( "PRESS", "КЛАВИША" )
}

}

ПРИМЕЧАНИЕ: Все что справа от символа # считается комментарием и на работу не влияет.
Это не относится к скриптам в папке C:\Program Files\SlyDiman\SlyControl2\Data\CfgWizard

Вставили? Хорошо, везде там где прописано PROG меняете на название программы (например ATITV). Так прописываем до конца, не забудьте прописать правильный путь к программе в ExecFile и если надо параметр добавить то добавляйте либо сотрите эту строчку вместе с запятой. Далее в скрипте будем прописывать, текст и иконку которые будут выводиться при запуске, вот так я сделал у себя:

ATITV_Always = Group( Enabled ){

OnGroupEnable(){ WinMon.StartPreset( ATITV) }

ATITV_Start = Hook( "TV", "ATITV", Enabled, Break ){
h = WinMon.ActionPreset( ATITV)
Skip( 2, h = 0 )
WinCtrl( "ACTIVATE", h )
Skip( 2 )
e = ExecFile( "F:\Program Files\ATI Multimedia\main\ATIMMC.EXE", "/TV+" )
Break( e = 0 )
GroupEnable( ATITV )
}

ATITV_Create = Hook( "WINMON", "ATITV_CREATE", Enabled ){
GroupEnable( TV )
}

ATITV_Activate = Hook( "WINMON", "ATITV_ACTIVATE", Enabled ){
GroupEnable( ATITV )
}

ATITV_Close = Hook( "WINMON", "ATITV_CLOSE", Enabled ){
GroupDisable( ATITV )
}

MediaDisable = Hook( "MMEDIA", "DISABLE", Enabled ){
Break( MediaDisable = 999 )
GroupDisable( ATITV )
}

}

#===========================================================


ATITV = Group( Disabled ){

OnGroupEnable(){
EventSend( "MMEDIA", "DISABLE", 999 )
OSD( "Apps", "Телевизор", "P:CHRISTV.bmp" )
}

иконки находяться в С:\Program Files\SlyDiman\SlyControl2\Plugins\OSD\Images
Можно использовать *.ico и *.bmp файлы, т.е. свои вставлять.

ПРИМЕЧАНИЕ: Хочу пояснить что такое 999 рядом с MediaDisable. Когда открывается какая-то мультимедийная программа, для которой загружен скрипт (например Winamp), то всем скриптам посылается команда MediaDisable, чтобы они отключились и освободили кнопки типа PLAY, PAUSE, STOP и др. Сам же скрипт пославший сообщение MediaDisable не должен на него реагировать. Если этого не сделать, то невозможно предсказать какая и как из нескольких мультимедийных программ загруженных одновременно отреагирует например на кнопку PLAY. Число 999 может быть любое, главное чтобы оно не повторялось в других скриптах (см. main.scs). Если копать глубже то нужно смотреть в описании оператора Hook 4-й и 5-й параметры - они задают порядок и условия обработки события, в случае если одному событию (например одной кнопке пульта) соответствует несколько hook'ов.

Далее делаем две клавиши, "во весь экран" и "следующий канал", за основу берутся быстрые клавиши требуемой программы, то есть r ghbvthe для ATI MultiMedia Center у нас получилось "во весь экран" клавиши CTRL+F, а "следующий канал" клавиша вверх (сравните с оригиналом с верху и сделайте также под свою программу, строка MyRemote означает название команды):

ZoomRemote = Hook( "REMOTE", "ZOOM", Enabled, Break ){
Break( ZoomRemote <> 0 )
h = WinMon.ActionPreset( TV )
break( h = 0 )
# a = WinCtrl( "ISACTIVE", h )
# skip( 1, a <> 0 )
# WinCtrl( "ACTIVATE", h )
Keyboard( "PRESS", "Ctrl+F" )
}

ChanelUPRemote = Hook( "REMOTE", "9", Enabled, Break ){
Break( ChanelUPRemote <> 0 )
h = WinMon.ActionPreset( TV )
break( h = 0 )
# a = WinCtrl( "ISACTIVE", h )
# skip( 1, a <> 0 )
# WinCtrl( "ACTIVATE", h )
Keyboard( "PRESS", "UP" )
}

ПРИМЕЧАНИЕ: Закомментированные команды (после #) написаны для проверки является ли окно нужной программы активным и если нет, то активизируют его. При необходимости уберите # перед этими командами.

ПРИМЕЧАНИЕ: Что означает Break( ChanelUPRemote <> 0 ) в последнем примере? Дело в том что при нажатии кнопки на пульте скрипт получает несколько сообщений, сначала с кодом 0, потом (если держать кнопку) то с кодом 1,2,3 и т.д., при отпускании кнопки на пульте код равен -1. Команда Break( ChanelUPRemote <> 0 ) отфильтровывает все кроме первого нажатия (код 0). Если ее убрать, то Ctrl+F сработает как минимум 2 раза - при нажатии кнопки на пульте (код 0) и при ее отпускании (код -1).

И что же у нас получилось а получилось то что при нажатии на пульте клавиши Zoom у нас прога становиться во весь экран :) а при нажатии другой кнопки переключался канал :) вот так дальше и задаем разные кнопки.


7. Теперь делаем так чтобы при нажатии на пульте кнопок TV, Video, Audio, Radio, появлялись не только те программы, которые можно выбрать в SlyControl`е, когда мы были в мастере настройки, а те что нам нужны.

Рассмотрим на примере кнопки TV, там можно выбрать много из стандартных.
Но, вдруг они вам все не нравятся, или не подходят к вашему железу. Значит надо выбрать другую. Итак, помните мы выбирали в начале в Мастере настроек приложения по умолчанию? Вот там и посмотрите что вы выбрали, если вы выбрали то что я написал по умолчанию, т.е. TVTool то найдите его скрипт, потом в самом начале скрипта найдите строчки:
e = ExecFile( "C:\Program Files\TVTool 6.5\tvtool.exe" )
это команда выполнить, отредактируйте её чтоб там стояло, например:
e = ExecFile("C:\WINDOWS\System32\calc.exe" )
Теперь при нажатии на пульте кнопки Video будет запускаться калькулятор.

ПРИМЕЧАНИЕ: Не очень удачное решение ;-)
Лучше откройте файл C:\Program Files\SlyDiman\SlyControl2\Data\CfgWizard\favorites.scs
и найдите фрагмент:

### SELECT TV ###
# TVTool
# EventSend( "TV", "TVTOOL")
# DScaler
# EventSend( "TV", "DSCALER")
....
# MultiDec
# EventSend( "TV", "MultiDec")
### END ###

А теперь можете добавить ДВЕ строки вида

# PROGNAME
# EventSend( "TV", "PROG")

и в мастере настройки для кнопки TV появится пункт PROGNAME. В приведенном выше примере PROG заменялся на ATITV, это будет выглядеть так:

# MultiDec
# EventSend( "TV", "MultiDec")
# ATI MultiMediaCenter (TV)
# EventSend( "TV", "ATITV")
### END ###


8. Теперь сделаем так, чтоб SlyControl нормально находил нашу программу:
Заходим в вкладку модули, выбираем модуль WinMon. Находим в списке приложений мониторинга, нашу, т.е. в данном случае ATITV и нажимаем кнопку настройка событий, появляется непонятное окно с нужными нам строками Class Name и Windows Text:

Но мы эти Class Name и Window Text можем и не знать, в этом случае надо зайти в нашу нужную программу, перейти в SlyControl, зайти в меню "настройка" и нажать на "Информация о программах:" либо нажать клавишу F3:

Потом появляется окно, начинаем искать нашу программу и ищем в ней более или менее вразумительного названия Class Name и Window Text:

И вписываем эту информацию в модуль, и всё :)

ПРИМЕЧАНИЕ: Можно поступить проще - в "непонятном окне" нажать кнопку Detect, потом подвести курсор мыши к заголовку нужного окна и нажать кнопку Scroll Lock (по умолчанию). Если заголовок окна меняется (например в нем отображается название канала / фильма / музыкальногофайла), то WindowText можно не указывать. Но если ClassName не уникальный (встречается в других программах), придется в Window Detect Method вместо FindWindow выбрать Advanced и ... это уже не для этого FAQ ;-)

Советую после каждой удачной измены в скриптах делать резервную копию программы.