13 лет назад 8 сентября 2005 в 20:49 64

SLYCONTROL — ЭТО УНИВЕРСАЛЬНАЯ ПРОГРАММА ДЛЯ ИНТЕЛЛЕКТУАЛЬНОГО УПРАВЛЕНИЯ РАЗНЫМИ ПРОГРАММАМИ В СИСТЕМЕ WINDOWS. ОДНО ИЗ ЕЕ НАИБОЛЕЕ РАСПРОСТРАНЕННЫХ ПРИМЕНЕНИЙ — УПРАВЛЕНИЕ ЧЕРЕЗ ИНФРАКРАСНЫЙ ПУЛЬТ ДИСТАНЦИОННОГО УПРАВЛЕНИЯ.

ВЫБОР ОБОРУДОВАНИЯ
Начнем с самого начала — выбора оборудования. Рассмотрим варианты.

1. У вас есть ТВ-тюнер с пультом. Сразу важное замечание: никакой другой пульт с этим оборудованием работать не будет. Если ИК-приемник (ИКП) подключается в USB-порт, SlyControl можно использовать только в случае совместимости ИКП с MS eHome Remote Control. Другие “брендовые” USB-ИКП не поддерживаются. Если ИКП подключается в COM-порт, его можно легко настроить (обычно такие ИКП идут в комплекте с тюнерами Pinnacle). Если ИК-датчик подключается к PCI-плате ТВ-тюнера, то тут все зависит от чипа тюнера – это могут быть Conexant bt848/878, Conexant CX2388x и Philips SAA713x. Для начала нужно выяснить название чипа.

Для каждого чипа в программе есть отдельный универсальный модуль (btRemote, CX2388x и SAA713x), который подходит для тюнера на этом чипе независимо от производителя. Есть и исключения – например, тюнер Acorp pv951 на чипе bt878 с универсальным модулем не работает. Для него есть отдельный модуль, хотя и очень проблемный. Если вы правильно выбрали модуль для вашего чипа, но в списке не оказалось вашего тюнера, вероятно, его можно добавить вручную. Но для этого уже потребуются определенные навыки. Подробные инструкции изложены в описании соответствующих модулей.

2. У вас есть IrDA-порт. Если это USB-порт, например Tekram IR-410, сразу забудьте про ДУ – он не подойдет. Если у вас COM-версия, например Tekram IR-210, или IrDA встроен в материнскую плату, то можно использовать в SlyControl специальный модуль IR210. Но тут есть ряд ограничений. Сразу стоит заметить, что этот вариант не лучший: низкая стабильность распознавания команд, сильная зависимость от загрузки центрального процессора, отказ от работы с некоторыми пультами (например SONY, Samsung (RC-5) и др.). Необходимо удалить драйверы на IrDA-порт, чтобы дать доступ к COM-порту (как это сделать, смотрите в описании модуля IR210). Если это внешний Tekram IR-210, то можно не удалять драйверы, а просто переключать вручную в соседний COM-порт и использовать, например, COM1 для IrDA, а COM2 для ДУ.

3. Вы только задумались о приобретении ИКП, и тогда у вас есть два варианта: самому спаять простенький ИК-приемник (себестоимость – 50 руб.) или приобрести готовый на базе микроконтроллера (от 250 до 700 руб). Самодельный ИКП имеет все те же застарелые проблемы: низкая стабильность распознавания команд, сильная зависимость от загрузки центрального процессора. ИКП на базе микроконтроллера выполняет декодирование команд ДУ аппаратно и не загружает центральный процессор.

Такие ИКП обычно подключаются в COM-порт и передают всего шесть байт на одну команду пульта. Это так называемые UIR-совместимые ИКП (в интернете можно заказать ИКП RedRay, Uniper). USB-версии обычно работают через виртуальный COM-порт по такому же принципу (IRLink). Исключение составляет ИКП IgorPlug-USB – он не декодирует команду и передает компьютеру информацию обо всех импульсах, полученных с пульта. Сейчас в продаже уже появились USB-ИКП, совмещенные с USB-IrDA в одном устройстве (IRLink Combi).

УСТАНОВКА, СОХРАНЕНИЕ И ПЕРЕНОС КОНФИГУРАЦИИ
При инсталляции все файлы SlyControl просто распаковываются в указанную папку (в системные папки вроде C:\Windows никакие файлы не записываются). В реестре также не хранится никакая ценная информация, только расположение окон и несколько галочек (такие как “показывать уведомления в трее”). Эти параметры могут быть быстро выставлены через меню программы. SlyControl не привязывается к пути установки, поэтому можно иметь несколько копий с разными настройками в разных папках. Чтобы скопировать на другой компьютер достаточно скопировать папку с программой и сделать ярлык для запуска. Для удаления программы нужно удалить папку, в реестре же можно ничего не чистить.

Сама программа SlyControl самостоятельно не выполняет никаких действий. С внешним миром она общается через подключаемые модули (plug-ins – плагины). Через плагины она получает сообщения (команды), анализирует их и при необходимости через плагины же выполняет ответные действия.
Плагины располагаются в подкаталоге Plugins, обычно еще каждый в своем подкаталоге, соответствующем названию плагина. Каждый плагин — это .dll-файл, к нему прилагается настроечный файл.ini и другие файлы в зависимости от специфики плагина. Обычно плагины настраиваются один раз под конкретное оборудование (например, при обучении программы конкретному пульту дистанционного управления). В дальнейшем эта информация хранится в .ini-файлах.

Основная конфигурация программы задается файлами скриптов. Это текстовые файлы в подкаталоге Data с расширением.scs, которые можно изменять даже в Блокноте. SlyControl можно настраивать двумя способами: редактируя скрипты, как текст на закладке “Скрипт” (чем-то напоминает написание программы), или пользуясь графическим интерфейсом, то есть тыкая мышкой в кнопки, галочки и списки на закладке “Структура”. Во втором случае программа формирует тот же самый скрипт автоматически. Получается, скрипт первичен. Его редактировать быстрее и проще, чем пользоваться графическим интерфейсом – достаточно понять основные принципы. Так что будем делать из вас программистов… по “бразильской” системе.

При первом запуске SlyControl открывается мастер конфигурации. Сначала предлагается выбрать модуль для пульта ДУ. Смотрите картинку, читайте описание. Ставим галочку напротив нужного модуля – появляется кнопка “Настройка”. Нажимаем, выбираем основные параметры (модель тюнера, COM-порт и т. д. в зависимости от конкретного оборудования и плагина). Для некоторых тюнеров все кнопки пульта уже записаны в конфигурацию плагина, и их можно изменить только вручную в .cfg-или .ini-файле в папке с этим плагином.

Для универсальных ИКП, которые могут работать с разными пультами, нужно обучить плагин вашему пульту. Если плагин правильно настроен и реагирует на пульт, нажимаем очередную кнопку на пульте – в окошке “Мониторинг” появляется код кнопки. Нажимаем “Добавить” (код попадает в список) и редактируем название кнопки. Можно использовать прописные и строчные буквы. Желательно применять стандартные названия, тогда вам не придется корректировать скрипты. Например, VOL_UP, а не Volume+, Vol+ или еще как-то.

FWD вместо FF, REW вместо RW, DISPLAY вместо MENU, ENTER вместо OK и т. д. Список стандартных названий есть в файле Data\std_keys.txt. Для некоторых кнопок в скрипте remote.scs сделано переопределение (remap) – например, кнопка RESIZE/FULLSCREEN транслируется в стандартное название ZOOM.

ПРИМЕЧАНИЕ. Список плагинов на первом шаге мастера конфигурации берется из файла-шаблона Data\CfgWizard\remotecfg.scs, в результате работы мастера из него выкидывается лишнее, и он перезаписывается вместо Data\remotecfg.scs. Поэтому не стоит исправлять файл Data\remotecfg.scs вручную. В скриптах символ “#” служит для комментариев и служебных меток. Все, что правее символа “#” в текущей строке, не рассматривается программой.

Жмем “Применить” и попадаем на второй шаг. Здесь можно подключить эмуляцию WinLirc-сервера. Некоторые программы умеют принимать команды ДУ от WinLirc. Они уже адаптированы для управления пультом, и их проще будет настроить на работу с SlyControl, если использовать протокол WinLirc. Если не нужно, не включайте эту опцию. Когда WinLirc-сервер активен, некоторые файерволлы и антивирусы могут зафиксировать сетевую активность в порте 8765 – это нормально.

ПРИМЕЧАНИЕ. Скрипт wlircsrv.scs, в котором загружается плагин WinLirc Server, подключен всегда. Мастер лишь деактивирует этот скрипт добавлением в первой строке команды $DISABLED. Деактивируются и любые другие скрипты, если они временно не нужны.

На третьем шаге – настройка плагина SndMixer. В предыдущих версиях SlyControl нужно было настраивать все команды для этого плагина (основная громкость, LineIn и т. д.). Последняя версия сама определяет канал микшера. Поэтому достаточно настроить только канал для тюнера (у кого-то это может быть LineIn, у кого-то – AUX).

Отметим, что команды плагинов бывают двух видов: когда в скрипте указываются все необходимые параметры и когда указывается только имя конфигурации (preset), и все необходимые настройки для выполнения команды плагин берет оттуда. В данном случае настраиваются пресеты MuteTuner и UnmuteTuner. С некоторыми новыми материнскими платами со встроенным 8-канальным звуком плагин SndMixer работает некорректно. Решением может быть возврат к пресетам для управления не только звуком тюнера, но и всеми остальными каналами. Для этого нужно открыть скрипт sndmixer.scs (в программе или даже в Блокноте) и найти строки вида:

# m = SndMixer.ActionPreset( Mute );
m = SndMixer( “Toggle”, “Master”, “Mute” ).

Первая строка относится к старой версии, используется preset Mute. Вторая строка — новая версия — означает переключить галочку “Mute” на канале “Master” (общая громкость). Для возврата к старой версии достаточно в первой строке убрать символ “#” (раскомментировать), а во второй добавить его (закомментировать) или вообще удалить вторую строку. То же самое надо сделать с командами VolumeUp, VolumeDown и другими (при необходимости). Вызвать окно настройки пресета можно на закладке “Модули”. Нужно выбрать нужный модуль (SndMixer), выбрать preset и нажать “Настройка действия”.

На четвертом шаге отметьте нужные программы. Здесь же можно отредактировать путь к программе. По сути, здесь выводится список скриптов из папки Data\Apps. Неотмеченные скрипты деактивируются командой $DISABLED в первой строке. Путь к программе корректируется прямо в скрипте (находится вызов плагина ExecFile и исправляется его параметр).

На пятом шаге выбираем, какие программы запускать кнопками пульта AUDIO, VIDEO, TV, RADIO. Список программ берется из скрипта-шаблона Data\CfgWizard\favorites.scs. Из него выкидывается лишнее и результат перезаписывается вместо Data\favorites.scs, поэтому не нужно редактировать этот файл вручную.

На шестом (последнем) шаге можно отключить иконку в трее, настроить время выключения компьютера и т. д. Иконка отключается путем активации скрипта tray_off.scs (а уже он вызывает плагин для отключения иконки). Время выключения вписывается в скрипт shutdown.scs, где запускается таймер.

ПРИМЕЧАНИЕ. Вышесказанное еще раз подтверждает, что сама по себе программа SlyControl мало что умеет, даже свою иконку в трее выключить не может – все делается через плагины, вызовы которых настраиваются в скриптах. Это и делает программу очень гибкой, хотя и достаточно сложной в настройке.

Итак, после мастера конфигурации нажимаем “Старт”, SlyControl активизируется, то есть начинает выполнять все то, что написано у него в скриптах. При обычном запуске, если в мастере настройки нет галочки “открывать при загрузке” и в скриптах нет ошибок, SlyControl активизируется автоматически и сворачивается в трей.

Простая проверка. Допустим, при настройке пульта вы не забыли вписать кнопку AUDIO (если реально такой кнопки нет на вашем пульте, можно назвать AUDIO любую другую). Нажимаем эту самую AUDIO. Если в мастере конфигурации на четвертом шаге вы не отключили Winamp (и там указан правильный путь) и на пятом шаге Winamp выбран для кнопки AUDIO, то должен запуститься Winamp. Также должны работать кнопки PLAY, PAUSE, STOP, REW, FWD, PREV, NEXT, POWER.

Теперь разберемся, как одни и те же кнопки пульта могут функционировать в разных приложениях. В простейшем случае программы дистанционного управления работают по принципу: нажали кнопку (произошло событие) — выполнили действие. Это годится для случая, когда по одной конкретной кнопке запускается одно конкретное приложение, и одно это приложение и управляется (то есть кнопки PLAY, STOP работают, например, только в Winamp). Но допустим, у нас одновременно запущен Winamp и PowerDVD (или Windows Media Player, не важно). Кнопка PLAY должна срабатывать на том приложении, которое в данный момент активно. Но если закрыть PowerDVD, а Winamp свернуть (активным при этом может быть Internet Explorer), кнопка PLAY должна срабатывать для Winamp (даже если он не активен).

Чтобы все это реализовать, в SlyControl есть группировка. И эти группы можно активировать и деактивировать. Есть группы, которые активны постоянно, и в них обрабатываются глобальные события (например, тот же запуск Winamp по кнопке AUDIO). А есть группы, в которых обрабатываются события, характерные только для данного приложения – например, при нажатии PLAY должно включиться воспроизведение в Winamp (в PowerDVD кнопке PLAY будет соответствовать уже другое событие, и там нужно будет включить воспроизведение в PowerDVD). Такие группы по умолчанию деактивированы, а активируются они только при запуске “своего” приложения. Кроме того, допустим, активна группа, управляющая Winamp, и вы запускаете PowerDVD. При этом должна активироваться группа, отвечающая за управление PowerDVD и отключиться группа для Winamp.

Перейдем к практике. Поддержка отдельного приложения обычно вынесена в отдельный скрипт (.scs-файл), который располагается в папке Data\Apps. Такие скрипты загружаются из главного скрипта Data\main.scs командой вида include( “Apps\winamp.scs” ). Напомним, чтобы отключить скрипт, удобнее добавить в его первую строку команду $DISABLED, а не искать и удалять строку include( “Apps\…..scs” ) из главного скрипта Data\main.scs (для этого лучше всего воспользоваться мастером конфигурации).

Каждый скрипт для приложения содержит две группы. Одна активна постоянно и отвечает за отслеживание запуска/активации и закрытия приложения. При запуске приложения активируется вторая группа, которая обрабатывает специфические для данного приложения события. При закрытии приложения первая группа это “видит” и выключает вторую. Также во всех таких скриптах обрабатывается событие MediaDisable.

Его смысл в следующем: при активации второй группы для какого-нибудь приложения посылается команда MediaDisable с параметром (некое уникальное число – свое для каждого скрипта), при этом первые группы всех остальных скриптов обрабатывают это событие, и если число не совпадает, выключают свои вторые группы. Приведем пример. Был запущен Winamp. Скрипт Apps\Winamp.scs содержит группы “Winamp_Always” (всегда активна) и просто “Winamp” (группа активна тогда, когда запущен Winamp). Для Winamp выбрано число 100.

Теперь запускаем PowerDVD. В скрипте Apps\PowerDVD.scs группа “PowerDVD_Always” “увидела”, что запущен PowerDVD, и включила группу “PowerDVD”. В это мгновение активны две группы “Winamp” и “PowerDVD”, которые отслеживают такие кнопки, как PLAY, STOP и другие. При нажатии PLAY включится воспроизведение и в Winamp, и в PowerDVD. Но при активации группы “PowerDVD” выполняется команда MediaDisable с параметром 5 (5 выбрано для PowerDVD). При этом группа “PowerDVD_Always” обрабатывает эту команду, параметры не совпадают, поэтому группа “Winamp” выключается. Группа “PowerDVD_Always”, как и все другие активные, тоже обрабатывает команду MediaDisable, но параметры совпадают и группа “PowerDVD” остается активной.

Как все это выглядит в скриптах? Вот скрипт Apps\PowerDVD.scs в графическом представлении: [apps_powerdvd.gif]. Если нажать “Открыть описание”, то мы попадем в скрипт main.scs на строку:

include( “Apps\powerdvd.scs” )

Выделим группу “PowerDVD_Always”.
[powerdvd_always.gif].
Если нажать кнопку “Скрипт…”, то мы перейдем в скрипт Apps\PowerDVD.scs на пятую строку, где записано:

PowerDVD_Always = Group( Enabled ){

Примечание: символы “{” и “}” означают начало и конец блока, в данном случае группы.
Группа “PowerDVD” выглядит вот так:
[powerdvd.gif].
В скрипте ей соответствует строка 38:

PowerDVD = Group( Disabled ){

Обратите внимание на разницу между включенной и выключенной по умолчанию группами (Enabled/Disabled).

ПРИМЕЧАНИЕ. В SlyControl реализована эмуляция мыши, стрелок клавиатуры или цифр. Для этого на пульте должны быть кнопки от 0 до 9 и три кнопки пульта, названные MOUSEMODE, ENTER и CANCEL. Режимы эмуляции переключаются кнопкой MOUSEMODE. В режиме стрелок отключается Num Lock, а в режиме цифр, наоборот, включается. Кому-то Num Lock нужен, кому-то нет. Найдите в скрипте key_mouse.scs группы Key0Grp, Key1Grp, MouseGrp. Одна из них по умолчанию должна быть включена, остальные выключены. Key0Grp отвечает за цифры и включает Num Lock, Key1Grp отвечает за стрелки и выключает Num Lock. Можете исправить, как вам нравится.

Обработка событий. Чтобы SlyControl реагировал на события, нужно внутри группы создать ловушки – hooks. Естественно, если группа выключена, то и ловушки внутри нее неактивны. Сами ловушки также по отдельности можно включать и выключать. Для идентификации события служит “тип” и “ID”. Например, при нажатии клавиши на клавиатуре будет событие типа “KEY”, а ID будет соответствовать названию нажатой клавиши (или комбинации клавиш). Для пульта ДУ тип будет “REMOTE”. Для отслеживания события MediaDisable сделаем вот такой hook.
[mediadisable.gif].

Тип – “MMEDIA”, ID – “DISABLE”. По умолчанию hook включен. Галочка “Продолжить цепочку hooks” означает, что если есть одновременно две или более активных ловушки (hooks) для одного события, то после обработки очередного события нужно обработать следующее. Если галочку убрать, то не во всех остальных сриптах может обработаться команда MediaDisable, и возможна ситуация, когда останутся несколько активных групп для разных приложений, которые будут одновременно обрабатывать кнопки PLAY, STOP и другие, и возникнет путаница.

Ловушки также могут быть для внутренних событий – включение и выключение групп и обычных ловушек. Например, если группа активна по умолчанию и на ее включение стоит ловушка, то команды внутри этой ловушки выполняются при старте SlyControl. Внутрь ловушки помещаются команды, которые выполняются последовательно при возникновении указанного события. Для MediaDisable указаны две команды.

Первая: прервать исполнение следующих команд в случае выполнения условия MediaDisable=5 (5 – это параметр, свой для каждого приложения, для Winamp, например, мы выбрали 100). Итак, если команда MediaDisable послана из группы PowerDVD этого же скрипта, то она начнет выполняться, но прервется на первом же шаге, а вот в других скриптах не прервется (там параметр другой). Вторая команда – это выключение группы “PowerDVD”. В скрипте это выглядит так:

PowerDVD_Always = Group( Enabled ){

MediaDisable = Hook( “MMEDIA”, “DISABLE”, Enabled ){
Break( MediaDisable = 5 )
GroupDisable( PowerDVD )
}
}

Команды break (прервать выполнение), skip (пропустить и не выполнять несколько команд), GroupEnable, GroupDisable, HookEnable, HookDisable (включение/выключение групп и ловушек), EventSend – это так называемые внутренние команды (). Все остальные команды вызываются через плагины.
Отдельно остановимся на команде EventSend. Эта команда имитирует событие. Например, у вас нет на пульте кнопки PLAY, и вы хотите использовать для этого кнопку OK, но не хотите в настройках плагина ДУ переименовывать кнопку OK в PLAY. Можно написать такой скрипт:

MyGroup = Group( Enabled ){
Ok2Play = Hook( “REMOTE”, “OK”, Enabled, break ){
EventSend( “REMOTE”, “PLAY”, Ok2Play )
}
}

В этом примере при нажатии кнопки OK на пульте сработает ловушка Ok2Play и выполнится одна команда, которая сымитирует нажатие кнопки PLAY. Все остальные скрипты обработают это событие. По этому принципу сделан remap кнопок пульта. Также EventSend используется для посылки команды MediaDisable. Это происходит при активации второй группы, выключенной по умолчанию (в данном случае при активации группы “PowerDVD”):

PowerDVD = Group( Disabled ){
OnGroupEnable(){
EventSend( “MMEDIA”, “DISABLE”, 5 )
OSD( “Apps”, “PowerDVD”, “P:PowerDVD.ico” )
}

}

ПРИМЕЧАНИЕ. OSD (…) здесь – вызов плагина OSD (OnScreenDisplay). При этом на экране отображается сообщение. Параметры настраиваются в пресете “Apps” для плагина OSD. В сообщение подставляется слово “PowerDVD” и рисуется иконка, взятая из файла Plugins\OSD\Images\PowerDVD.ico

Вернемся к последней картинке. Там видно, что группа “PowerDVD” активируется по событиям “PowerDVD_Create” и “PowerDVD_Activate”, а по событию “PowerDVD_Close” деактивируется. Эти события генерируются плагином WinMon, который следит за всеми окнами (программами) Windows. При старте группы “PowerDVD_Always” (она включена по умолчанию; то есть при старте SlyControl) выполняется команда StartPreset в плагине WinMon. Имя пресета – PowerDVD. После этого WinMon начинает отслеживать программу PowerDVD и генерирует события с типом “WINMON”. ID формируется из имени пресета и слова “_CREATE”, “_ACTIVATE”, “_CLOSE”.

Таким образом, вторая группа скрипта, отвечающая за управление PowerDVD, может автоматически включаться при запуске PowerDVD (даже если вы это сделаете вручную, а не через SlyControl). Также при активации. Например, у вас запущен PowerDVD и Winamp. Будет активна та группа, чья программа активирована последней. При закрытии программы группа автоматически отключается. Пресеты для плагина WinMon настраиваются на закладке “Модули”. Смысл настройки заключается в том, чтобы указать уникальные для главного окна программы параметры.

Большинство программ можно отследить через поиск окна по имени класса или по заголовку (метод “FindWindows”). Например, для PowerDVD постоянным является имя класса “CyberLink Video Window Class”. Но некоторые программы имеют стандартное имя – например, многие программы, написанные на Delphi, могут иметь имя класса Form1, а заголовок окна может изменяться по ходу работы программы. Тогда в настройках пресета плагина WinMon нужно выбрать метод “Advanced”. Здесь можно привязаться к названию файла программы, проверять часть имени класса или заголовка, указать размеры и положение отдельных элементов внутри окна. Этот метод работает медленнее, но позволяет точно идентифицировать программу.

Для простоты настройки можно нажать кнопку “Detect”, навести мышь на главное окно интересующей программы и нажать Scroll Lock. Вся информация заполнится автоматически. Потребуется только расставить галочки, что проверять, а что нет. Будьте внимательнее с проверкой положения окна – у большинства программ оно постоянно разное. Для детального исследования программы, которой вы хотите управлять (для которой хотите написать скрипт), можно использовать Windows Monitoring, встроенный в SlyControl. С его помощью можно просмотреть всю иерархию окон и элементов любой программы, их параметры.

Из того, что касается запуска приложения, осталось разобрать hook “PowerDVD_Start”. Этот hook настроен на событие типа “VIDEO”, ID “POWERDVD”. Это сделано для совместимости со скриптом favorites.scs (запуск по кнопке VIDEO). Но ничто не мешает написать сразу тип “REMOTE”, ID “VIDEO”. Команды этого hook выглядят так:

PowerDVD_Start = Hook( “VIDEO”, “POWERDVD”, Enabled, Break ){
h = WinMon.ActionPreset( PowerDVD )
Skip( 2, h = 0 )
WinCtrl( “ACTIVATE”, h )
Skip( 2 )
e=ExecFile(“C:\Program Files\CyberLink\PowerDVD\PowerDVD.exe” )
Break( e = 0 )
GroupEnable( PowerDVD )
}

Сначала выполняется команда h = WinMon.ActionPreset( PowerDVD ). При этом плагин WinMon, используя preset “PowerDVD”, ищет главное окно программы PowerDVD и возвращает его идентификатор (handle), это значение записывается в переменную h. Если h=0 (PowerDVD не найден, не загружен), то две следующие команды пропускаются, и мы сразу переходим на команду ExecFile. Тут все просто: запускается программа по указанному пути, результат в переменной e. Если произошла ошибка, то e=0, и на этом все заканчивается – команда break(e=0).

Если программа запустилась удачно, то следующей командой активируется группа “PowerDVD”. Вообще-то эта группа активировалась бы все равно по событию “PowerDVD_CREATE” от плагина WinMon, но зачем ждать полсекунды, пока плагин WinMon сообразит, что мы запустили PowerDVD? Если же на первом шаге PowerDVD был загружен (h не равно 0, то есть найдено главное окно PowerDVD), то выполняется команда плагина WinCtrl для активации этого окна, а далее пропускаются две команды для запуска PowerDVD, и в конце активируется группа “PowerDVD”.

А теперь самое простое. В группе “PowerDVD” перечисляются события, на которые надо реагировать. Речь идет о пульте ДУ, поэтому тип везде “REMOTE”. ID соответствует названию кнопки пульта. Тут надо сказать немного о параметре, который присутствует в любом событии. Для событий типа “REMOTE” и “KEY” параметр – это счетчик. Когда вы только нажали кнопку, генерируется событие, параметр равен 0. Если подержать кнопку 0,3 с., то каждые следующие 0,1 с. событие будет повторяться, и параметр каждый раз будет увеличиваться на 1. При отпускании кнопки также генерируется событие, параметр равен -1. Поэтому если просто написать hook на обработку кнопки пульта, например, так:

MyHook = Hook( “REMOTE”, “REW”, Enabled, Break ){

}

– то даже при очень коротком нажатии этот hook сработает дважды (на нажатие и отпускание кнопки). Чтобы hook сработал только один раз при нажатии кнопки, достаточно первой командой поставить:

break( MyHook<>0),

где MyHook – это название hook. Для таких действий, как перемотка повторение команды при удержании кнопки может оказаться полезным, тогда стоит немного изменить условие:

break( MyHook<0)

На всякий случай следующей командой стоит проверить, что нужная нам программа еще загружена:

h = WinMon.ActionPreset( PowerDVD )
Break( h = 0 )

Также иногда полезно активировать программу, прежде чем передавать ей какие-то команды, особенно если мы будем использовать эмуляцию клавиатуры. Неактивное приложение ничего не воспримет, даже если нажимать кнопки на настоящей клавиатуре.

WinCtrl( “ACTIVATE”, h )

ПРИМЕЧАНИЕ. В переменной h хранится идентификатор окна программы (в данном случае – PowerDVD). Эта команда имеет смысл, только если перед ней была:
h = WinMon.ActionPreset( PowerDVD )

Ну и, наконец, эмуляция нажатия на клавиатуре комбинации клавиш Ctrl+B:

Keyboard( “PRESS”, “Ctrl+B” )

Если нужно сымитировать нажатие одной клавиши, то можно попробовать команду вида:

Keyboard( “WM_PRESS”, “T”, h )

При этом нажатие на клавиатуре не эмулируется, а окну с идентификатором h посылается сообщение, что нажата клавиша “T”. При таком подходе окно можно даже не активировать командой WinCtrl( “ACTIVATE”, h ).
Вот как выглядят команды для перемотки в группе “PowerDVD”:

RewRemote = Hook( “REMOTE”, “REW”, Enabled, Break ){
Break( RewRemote < 0 )
h = WinMon.ActionPreset( PowerDVD )
Break( h = 0 )
WinCtrl( “ACTIVATE”, h )
Keyboard( “PRESS”, “Ctrl+B” )
}
FwdRemote = Hook( “REMOTE”, “FWD”, Enabled, Break ){
Break( FwdRemote < 0 )
h = WinMon.ActionPreset( PowerDVD )
Break( h = 0 )
Keyboard( “WM_PRESS”, “T”, h )
}

По кнопке POWER можно сделать закрытие PowerDVD:

PowerRemote = Hook( “REMOTE”, “POWER”, Enabled, Break ){
Break( PowerRemote <> 0 )
h = WinMon.ActionPreset( PowerDVD )
Skip( 1, h = 0 )
WinCtrl( “CLOSE”, h )
GroupDisable( PowerDVD )
}

Для создания скрипта под свою программу можно взять за основу какой-нибудь скрипт из папки Data\Apps (например, тот же powerdvd.scs). Нужно изменить в нем название групп и ловушек (hooks), в MediaDisable прописать другое число, которое не используется в других скриптах (например, больше 1000). Потом исправить путь к программе и указать, по какому событию (по какой кнопке) запускать. “Горячие” клавиши для вашей программы можно выяснить в настройках или в помощи. У некоторых программ нет “горячих” клавиш, тогда можно использовать эмуляцию мыши. Пример работы с программой Creative Surround Mixer можно посмотреть в скрипте sndmixerct.scs. Там запускается программа, выдерживается пауза (плагин Timer) и делается несколько кликов мышкой. Координаты рассчитываются, используя плагин Math.

Для более четкого управления под некоторые программы написаны специальные плагины. Используется уже не примитивная эмуляция мыши или клавиатуры, а четкие команды, которые срабатывают, даже если управляемая программа свернута. Такие плагины находятся в папке Plugins\Apps\…

Кратко остановимся на кнопках, которые используются для одних функций, но при активном приложении (тот же PowerDVD) работают совсем по-другому. Например, кнопка ZOOM. У ловушек есть приоритеты. Сначала срабатывают те, у которых приоритет меньше. В скрипте windows.scs в группе “Windows” есть ловушка Zoom, настроенная на кнопку пульта ZOOM, и ее командами запускается экранная лупа. Кстати, если вам это не нужно, просто отключите эту ловушку (заменить Enabled на Disabled). Приоритет у нее 200.

А в скрипте powerdvd.scs в группе “PowerDVD” у ловушки на ту же кнопку ZOOM приоритет не указан и по умолчанию равен 128. Кроме того, в описании ловушки есть слово “Break” – это как раз означает НЕ “Продолжить цепочку hooks”. Поэтому когда PowerDVD не запущен, по кнопке ZOOM работает экранная лупа, а когда запущен, срабатывает полный экран в PowerDVD, и другие ловушки на кнопку ZOOM уже не реагируют.

Для отладки скриптов можно использовать Журнал. Он позволяет просмотреть события, ход выполнения команд в плагинах и внутренних команд. Напомним, что SlyControl можно использовать не только с пультом ДУ. Например, SlyControl может заменить практически любую программу, поставляемую с мультимедийными клавиатурами. На дополнительные кнопки таких клавиатур можно назначить специфические команды, которые прилагаемые программы просто не могут выполнить. Плагин Keyboard может блокировать отдельные клавиши, и через скрипт можно реализовать remap или дать клавишам новые функции.

ПРИМЕЧАНИЕ. Здесь не были затронуты особенности работы с разными плагинами. В описании к каждому плагину есть список допустимых команд и параметров. Наиболее часто используемые плагины приведены в примерах. Кроме того, не рассматривались математические вычисления, использование строковых переменных, организация циклов, триггеров и т. д. – это уже не настройка, а программирование.