REDRAY управление компьютером с пульта Настройка SlyControl RedRay Edition Оглавление: Настройка программы SlyControl............................................................................................................... 2 Настройка скриптов..................................................................................................................................... 6 Приложение 1. Схема ИКП RedRay Lite. ............................................................................................... 14 Приложение 2. Схема ИКП RedRay Std. ................................................................................................ 16 Приложение 3. Синтаксис скриптов SlyControl...................................................................................... 17 Автор статьи: Nem ([email protected]) оригинал статьи - http://slydiman.compass.com.ru/scr/faq1.htm ПРИМЕЧАНИЯ, сделанные автором программы SlyControl ПРИМЕЧАНИЯ разработчиков RedRay™ www.redray.ru www.redray.ru Настройка программы SlyControl В этой статье я попытаюсь вам максимально быстро и просто объяснить, как настроить известную программу от автора SlyDiman, под свой пульт управления. И как создать скрипт под свою программу, чтоб SlyControl её понимал, не вдаваясь в подробности различных плагинов. 1. Итак, приступим: Устанавливаем саму программу, заходим в неё первый раз, и что мы видим, появляется Мастер настройки, и мы выбираем наш плагин пульта. Тут я думаю, ничего сложного нет. Рассмотрим пример для настройки ИК приемника RedRay Lite. Под любой другой плагин делается всё практический идентично: Если Вы используете ИК приемник RedRay Lite, то ставите галочку напротив плагина RedRay Lite (COM). Если Вы хотите, чтобы SlyControl запускался при запуске Windows, то поставьте галочку напротив "Открывать при запуске". 2 www.redray.ru 2. Затем жмём кнопку "настройка", и появляется окно, где нам нужно выбрать пульт. Здесь вам надо настроить кнопки на пульте делается это так: Направляем пульт к ИК, жмём нужную кнопку, но надо сделать так чтобы в мониторинге снизу была длинная волна, вот такая: Примечание: Убедитесь, что устройство подключено к выбранному СОМ порту. Режим RAW использовать не рекомендуется. Программа автоматически определяет вид модуляции: например, ПДУ Philips использует Bi-phase coding(RC-5), а для универсального пульта от Panasonic - это Pulse-distance modulation. Таким образом, через ИКП RedRay вы можете управлять ПК с любого пульта ДУ. Используйте пульт от телевизора, видеомагнитофона или музыкального центра. Совместимость с любым пультом обеспечит программа, которая настраивается под конкретный пульт. Нажимаем кнопку "Добавить->" и задаём название кнопки, осторожно! Надо чтоб кнопки соответствовали требуемой команде, вот список всех нужных команд (остальные я решил не предлагать вам из-за ненадобности) : 3 www.redray.ru "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" Полный список команд вы можете прочитать здесь: C:\ProgramFiles\SlyDiman\SlyControl2\Data\std_keys.txt Соответствие команд кнопкам ПДУ КОМАНДА ПДУ КОМАНДА VIDEO SETUP AUDIO ENTER TV DISPLAY RADIO UP TELETEXT DOWN CD LEFT DVD RIGHT WEB_LAUNCH 0123456789 MOUSEMODE FWD LEFTMOUSE REW RIGHTMOUSE PLAY LEFTMOUSE DOUBLECLICK PAUSE RIGHTMOUSE DOUBLECLICK STOP RECORD SLEEP NEXT SCAN PREV CANCEL VOL_UP CAPTURE VOL_DOWN POWER MUTE ZOOM RED BLUE YELLOW GREEN ПДУ Если у вас пульт с большим количеством кнопок, то вам будет удобно занести названия клавиш в таблицу 4 www.redray.ru 4. На четвертом шаге Вам предлагается выбрать любимые программы. Для выбранных программ будут загружены соответствующие скрипты. Часто бывает, что программа не управляется с пульта из-за того, что не выбран нужный скрипт. Дальше жмём кнопку "применить", там появиться WinLirc, вам скорее всего он не понадобиться, жмём "применить" дальше. Появляется настройка управления общей громкостью, тоже жмём "применить". Вот появилось очень интересное и нужное окно со скриптами, ставьте все скрипты, которые вам нужны и жмите далее ( и поставьте скрипты для WinAmp 2.x, Windows Media Player 6.4, TVtool и bRadio) . Вот здесь надо быть осторожнее, выставите программы по умолчанию для кнопок ТВ, Видео, Аудио, Радио. Ставьте те которые вам нужны, а если среди них нет нужной выберите любую, я лично расскажу вам на примере первых скриптов чтоб не путать, т.е. вот так: 5 www.redray.ru 5. Жмём кнопку "Применить" до конца. Итак, SlyControl RedRay Edition запустился. Теперь, если есть желание, можно заняться скриптами. Настройка скриптов 6. Чтобы SlyControl знал вашу программу надо написать скрипт, делается это очень легко ( я покажу пример с TV из ATI Multimedia Center), нажимаем во вкладке "структура" кнопку новый скрипт: Набираем в поле "имя файла" название программы, допустим TV: 6 www.redray.ru Нажимаем открыть, нас спрашивают "создать файл 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 ) } 7 www.redray.ru 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 и, если надо параметр добавить, то добавляйте либо сотрите эту строчку вместе с запятой. Далее в скрипте будем прописывать, текст и иконку которые будут выводиться при запуске, вот так я сделал у себя: 8 www.redray.ru 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 не должен на него реагировать. Если этого не сделать, то невозможно предсказать какая 9 www.redray.ru и как из нескольких мультимедийных программ загруженных одновременно отреагирует например на кнопку 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 у нас прога становиться во весь экран :) а при нажатии другой кнопки переключался канал :) вот так дальше и задаем разные кнопки. 10 www.redray.ru 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 ### 11 www.redray.ru 8. Теперь сделаем так, чтоб SlyControl нормально находил нашу программу: Заходим в вкладку модули, выбираем модуль WinMon. Находим в списке приложений мониторинга, нашу, т.е. в данном случае ATITV и нажимаем кнопку настройка событий, появляется непонятное окно с нужными нам строками Class Name и Windows Text: Но мы эти Class Name и Window Text можем и не знать, в этом случае надо зайти в нашу нужную программу, перейти в SlyControl, зайти в меню "настройка" и нажать на "Информация о программах:" либо нажать клавишу F3: 12 www.redray.ru Потом появляется окно, начинаем искать нашу программу и ищем в ней более или менее вразумительного названия Class Name и Window Text: И вписываем эту информацию в модуль, и всё :) ПРИМЕЧАНИЕ: Можно поступить проще - в "непонятном окне" нажать кнопку Detect, потом подвести курсор мыши к заголовку нужного окна и нажать кнопку Scroll Lock (по умолчанию). Если заголовок окна меняется (например в нем отображается название канала / фильма / музыкальногофайла), то WindowText можно не указывать. Но если ClassName не уникальный (встречается в других программах), придется в Window Detect Method вместо FindWindow выбрать Advanced и ... это уже не для этого FAQ ;-) Советую после каждой удачной измены в скриптах делать резервную копию программы. 13 www.redray.ru Приложение 1. Схема ИКП RedRay Lite. ИК приемник RedRay Lite является улучшенным аналогом широко распространенного инфракрасного приемника WinLirk (DCD, DSR), схема которого показана на рис.1 рис.1 Сигнал снимается с выхода инфракрасного приемника и подается на вход DCD или DTR СОМ порта. Достоинства: Основное достоинство - простота и низкая себестоимость. Недостатки: 1. Очень нестабильное распознавание команд с ПДУ; Путает команды; 2. Программная обработка сигнала - лишняя нагрузка на процессор ПК. Идет постоянное сканирование сом порта; 3. Работает с ограниченным числом ИК приемников; 4. Требует индивидуальной настройки; 5. Для точной настройки требуется редактировать системные файла и файлы конфигурации СОМ порта1. В схеме нарушены паспортные условия эксплуатации ИК модуля и СОМ порта. Выходной сигнал с ИК модуля не согласован с входом СОМ порта. Для четкой работы своих входов COM порт требует сигналов обеспечивающих ток порядка 2мА, а выходной ток у фотоприемников по паспорту не должен превышать 0.5мА. В схемах WinLirk (DCD) это не обеспечивается, чем и объясняются частые неудачи при ее повторении. Схема подойдет тем, кому интересен сам процесс, а не результат. Вы проведете много времени за настройкой схемы и переобучением программы командам с ПДУ. И, скорее всего, спокойно управлять просмотром фильма с дивана, не получиться. Свободной от этих недостатков является схема, показанная на рис.2, по которой собран ИКП RedRay Lite. В данной схеме сигнал (импульсы +5…0В) с ИК фото-модуля IR1 поступает на вход транзисторного ключа VT1. Усиленный сигнал через светодиод VD1 поступает на транзисторный 1 - http://www.redray.ru/WIRCFAQ.htm 14 www.redray.ru ключ VT2, выход которого подключен к входу СОМ порта. Коммутация транзисторного ключа на VT2 обеспечивает подачу на вход СОМ порта сигналов с амплитудой +12В, где входной ток ограничивается резистором R2. Таким образом, обеспечивается четкое срабатывание триггеров СОМ порта. Следует заметить, что схема будет работоспособна, если подавать сигнал с выхода транзистора VT1 на вход (6) СОМ порта. Каскад на транзисторе VT2 введен только для работы индикатора на светодиоде VD1. рис.2 RedRay Lite представляет собой начальный уровень устройств, предназначенных для управления компьютером с пульта ДУ. Данная схема устраняет недостатки 3, 4, 5 и частично 1, которые присущи схемам WinLirk, DCD и т.д. Однако данная схема не способна самостоятельно сгенерировать код, который однозначно идентифицировал клавишу, нажатую на пульте ДУ. Функция распознавания кода здесь возложена на программу управления. Этой программой может быть SlyControl или SlyControl RedRay Edition, или Girder 3.xx, которые вы можете загрузить с сайта из раздела DownLoad. Примечание. Электронный конструктор RedRay Lite комплектуется платой, на которой впоследствии может быть собран ИКП RedRay Std. Заказать набор для сборки ЭЛЕКТРОННЫЙ КОНСТРУКТОР "REDRAY Lite" или необходимые радиодетали можно на официальном сайте RedRay. ЗАКАЗАТЬ ИНФРАКРАСНЫЙ ПРИЕМНИК REDRAY Lite ЭЛЕКТРОННЫЙ КОНСТРУКТОР www.redray.ru 15 www.redray.ru Приложение 2. Схема ИКП RedRay Std. Для точного распознавания сигналов, идущих от пульта ДУ необходимо замерять длительность ИК импульсов и временные интервалы между ними. Очень часто точность зависит от материнской платы, точнее от типа СОМ порта. Этим объясняются разные результаты распознавания для WinLirk подобных схем на разных компьютерах. Для устранения этого недостатка необходимо, чтобы инфракрасный приемник самостоятельно распознал сигнал и передал в компьютер только код, который соответствует данному сигналу. Тем самым, центральный процессор компьютера будет избавлен от необходимости обрабатывать и декодировать сигналы от пульта, а вся нагрузка по обработке сигнала будет возложена на ИК приемник. Такой принцип реализован в инфракрасных приемниках RedRay Std/Pro см. схему рис.3. рис.3 В этой схеме микроконтроллер DD1, тактируемый кварцевым генератором Qz1, выполняет автоматическое распознавание сигнала, которое принимает ИК модуль IR1 от пульта ДУ. Предварительно в микроконтроллер загружается программа для распознавания и декодирования ИК протокола RC-5, принятого для бытовых пультов дистанционного управления, работающих в инфракрасном диапазоне. ЗАКАЗАТЬ ИНФРАКРАСНЫЙ ПРИЕМНИК REDRAY Std. ЭЛЕКТРОННЫЙ КОНСТРУКТОР WWW.REDRAY.RU 16 www.redray.ru Приложение 3. Синтаксис скриптов SlyControl Синтаксис скриптов SlyControl оригинал статьи на http://slydiman.compass.com.ru/scr/sc2_lang.htm Синтаксис Символ '#' в начале строки означает комментарий Загрузка плагина: <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 события 17 www.redray.ru Пример: 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 18 www.redray.ru "строковое выражение в кавычках" целое число (например: -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 ){ 19 www.redray.ru # здесь могут быть любые действия } } # конец группы Действиями (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 и генерировать соответствующие события. Например: 20 www.redray.ru 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 21