Настройка программы SlyControl для чайников

Nem
  • 8 января 2004
  • 160k

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

Итак, приступим.

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

Настройка программы SlyControl

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

Настройка программы SlyControl

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

"POWER""0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
"VIDEO""UP"
"AUDIO""DOWN"
"TV""LEFT"
"RADIO""RIGHT"
"TELETEXT""ENTER" (use it for OK)
"CD""CANCEL"
"DVD""PLAY"
"VOL_UP""PAUSE"
"VOL_DOWN""STOP"
"MUTE""RECORD"
"SETUP" (use it for LOOP, REPEAT or RECALL)"CAPTURE"
"DISPLAY" (use it for MENU)"ZOOM" (remap from RESIZE or FULLSCREEN)
"SCAN" (use it for A or AUTOSCAN)"FWD" (use it for FF)
"RED""REW" (use it for RW)
"YELLOW""NEXT" (remap from CH_UP)
"GREEN""PREV" (remap from CH_DOWN)
"BLUE""SLEEP"

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

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

Настройка программы SlyControl

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

Настройка программы SlyControl

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

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

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

Настройка программы SlyControl

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

Настройка программы SlyControl

Нажимаем открыть, нас спрашивают "создать файл 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'ов.

Далее делаем две клавиши, "во весь экран" и "следующий канал", за основу берутся быстрые клавиши требуемой программы, то есть к примеру для 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" у нас прога становиться во весь экран :-) а при нажатии другой кнопки переключался канал :-) вот так дальше и задаем разные кнопки.

Теперь делаем так чтобы при нажатии на пульте кнопок "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 ###

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

Настройка программы SlyControl

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

Настройка программы SlyControl

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

Настройка программы SlyControl

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

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

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

Комментарии