Имя:
Пароль:
-- ИЛИ --
Войти, используя:

Форум   Общая тематика и компьютеры   Программирование

Пишем утилиту для использования пульта от AverTV Hybrid

Пример утилиты на Delphi
 
Пост #64516 от 2 ноября 2009, 11:56 

Mikola

Здравствуйте уважаемые форумчане. Это мой первый пост, поэтому не судите строго.
Вся история началась с покупки тюнера AverTV Hybrid+FM PCI. Стандартная софтина завелась с полоборота (Aver Media Center) и было счастье до тех пор, пока не захотелось лени ради использовать пульт от тюнера для управления тем же VLC и Winamp.
Перебрал кучу утилит, типа Girder, но так ни одна из них не поняла что от нее требуется. Пришлось искать свой вариант решения проблемы. На этом же форуме нашел похожую статейку, только там обсуждался тюнер типа AverTV 305. К сожалению, в моем случае архитектура оказалась другой и пришлось искать другие способы выхода из сложившийся ситуации.
Небольшой поиск импортируемых функций из комплекта установки стандартного ПО подсказал, что ответ надо искать в службе AverTV Remote Service. Хостовый файл у меня на машине находиться здесь:
C:\Program Files\Common Files\AVerMedia\Service\AVerRemote.exe

Дальше дело пошло быстрее. В среде Delphi создаем новый проект и делаем
Project->Import Type Library->RemoteService 1.0 Type Library->OK

В ответ система должна сгенерировать либу REMOTESERVICELib_TLB. Нас здесь, в первую очередь, интересуют интефейсы
...............
  _IRemoteEvents = dispinterface
    ['{6EC509E3-78E2-4FCB-93A4-035A1DA24AC9}']
    procedure OnRemoteData(nKeyFun: SYSUINT; nKey: SYSUINT; dwKeyCode: LongWord); dispid 1;
..............

  IRemoteCtrl = interface(IDispatch)
    ['{CF52E9A5-F2E0-4AB9-AF6D-52AF7AAE1AE4}']
    procedure GetDeviceNum(out nDeviceNum: SYSUINT); safecall;
    procedure EnumDeviceInfo(nIndex: SYSUINT; out hwInfo: tagHWINFO); safecall;
    procedure DetectHW; safecall;
    procedure Initialize; safecall;
...................
class function CoRemote.Create: IRemoteCtrl;
begin
  Result := CreateComObject(CLASS_Remote) as IRemoteCtrl;
end;
.....................


_IRemoteEvents - это именно то, что нужно. Интерфейс предопределяет нужный нам эвент для обработки нажатия кнопки пульта : OnRemoteData
Теперь надо придумать как "привязать" его к нашему проекту. Здесь мне существенно помог юнит EvSink соотечественника Алекса Дерискибы. Он находится по адресу :
http-ссылка

Ну и, собственно, вот что приблизительно должно получится :
.........
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, REMOTESERVICELib_TLB, StdCtrls, ComObj, ActiveX, EvSink;
..............

  TfmIREventHandler = class(TForm)
.................
    procedure OnRemoteData(nKeyFun: SYSUINT; nKey: SYSUINT; dwKeyCode: LongWord);
//обработчик обязательно должен находится в секции published описания формы
.........
  private
    DevNum : Cardinal;
    RemoteCtrl : Remote;
    EventSink: IEventSink;
............
  end;

var
  fmIREventHandler: TfmIREventHandler;

implementation
..............
procedure TfmIREventHandler.FormCreate(Sender: TObject);
begin
............
 RemoteCtrl := CoRemote.Create;
//создаем COM Automation-объект 
end;
............
procedure TfmIREventHandler.FormShow(Sender: TObject);
var hwInfo: tagHWINFO;
    i : integer;
begin
//без этих двух строчек эвент работать не будет
  RemoteCtrl.Initialize;
  RemoteCtrl.DetectHW;
//получаем к-во пультов
  RemoteCtrl.GetDeviceNum(DevNum);
  for I := 0 to DevNum - 1 do
  begin
//получаем информацию по каждому пульту
    RemoteCtrl.EnumDeviceInfo(I, hwInfo);
    with hwInfo do
    begin
      ShowMessage(
        Format( 'Device name : %s' + #13#10 +
                'Device PnPID : %s' + #13#10 +
                'EnumRemoteID : %d' + #13#10 +
                'EnumMCERemoteID : %d'  + #13#10 +
                'CurRemoteID : %d' + #13#10 +
                'SelectedAP : %d' + #13#10 +
                'IsRemoteSupport : %d' + #13#10 +
                'IsEnable : %d' + #13#10 +
                'IRemoteControlEnumEx : %d' + #13#10 +
                'HWRemoteNotify : %d' + #13#10 +
                'IRemoteControlEnum : %d',
                [szDeviceName, szDevicePNPID, lEnumRemoteID,
                 lEnumMCERemoteID, lCurRemoteID, lSelectedAP,
                 wIsRemoteSupport, bIsEnable, bIRemoteControlEnumEx,
                 bHWRemoteNotify, bIRemoteControlEnum] )
       );
    end;
  end;

  // Создаем обработчик (event sink) и говорим ему, что он должен обрабатывать интерфейс DIID__IRemoteEvents 
  EventSink := TEventSink.Create(DIID__IRemoteEvents);
  // теперь связываем sink с обработчиком формы OnRemoteData
  // 1 это DispID метода OnRemoteData в интерфейсе _IRemoteEvents
  EventSink.AddEventHandler(1, fmIREventHandler, 'OnRemoteData');
  // Привязываем эвент к COM-источнику
  EventSink.Connect(RemoteCtrl);      
end;

procedure TfmIREventHandler.OnRemoteData(nKeyFun, nKey: SYSUINT; dwKeyCode: LongWord);
begin
  ShowMessage(IntToStr(nKeyFun));
  //Здесь делаем то, что нам нужно. nKeyFun - код нажатой клавиши (1-54)
end;

Всё - скелет готов. Моя программа загружает клавишные профили для разных приложений и, в зависимости от выбранного профиля, активизирует приложение и эмулирует отсылку ему заданной в конфигурации комбинации клавиш (реализовано на основе стандартного модуля sndkey32). При активизации стандартного приложения (AverTV Media Center) можно дизейблить прогу, чтобы избежать конфликтов. Для этого у меня висит поток, который периодически проверяет наличие главного окна с классом AverTV_Control.

Есть и небольшие баги - иногда, когда программа активна, AverTV Media Center перестает реагировать на сигналы от пульта. Почему - еще не разобрался.
Все собиралось в среде Delphi 7, но и в 2009 пойдет (лень было крутить старый sndkey32 :pc ). Спасибо за внимание, надеюсь кому-то это пригодится. Если будут вопросы или дополнения - не стесняйтесь, пишите в форум или в личку.
Отправить личное сообщениеПрофиль пользователяУкраина
Постов: 1
Нарушений: Нет
Пост #66779 от 6 апреля 2010, 17:11 

gonzales

доброе время суток Mikola, прочитал пост "Пишем утилиту для использования пульта от AverTV Hybrid", вроде все понятно. очень хочется попробывать, но по сссылке EvSink больше нет. Если есть возможность, вышлите исходник теста на
Дело в том, что я являюсь автором программы ПерехватЪ для управления с пульта Ду, и у меня большие проблемы именно с аверовскими тюнерами, а предложенный Вами вариант может существенно упростить и унифицировать работу с ними.
Очень жду весточки от Вас на почту или в аську 98969822.
Заранее спасибо,
с Уважением,
Миронов Алексей
Отправить личное сообщениеПрофиль пользователяРоссия
Москва
Постов: 7
Нарушений: Нет
Пост #67163 от 22 мая 2010, 09:15 

vlad45im

Для всех кого это заинтересует. У меня AverTV 305, на ХР работает прекрасно, обращение к пульту происходит через интерфейс IVampDevice. А вот на Семерке пришлось качать AverTV 6, который работает сходным, описанным Mikola, способом. Следующие строки кода, приведенные Mikola отключают AverTV 6 от пульта, т.е. сообщения от пульта получает только вызывающая программа.
# //без этих двух строчек эвент работать не будет
# RemoteCtrl.Initialize;
# RemoteCtrl.DetectHW;
После недолгих мучений, было выяснено, что достаточно вызова RemoteCtrl.InitialQuick, вместо Initialize и DetectHW. В этом случае работает и программа и AverTV 6. Т.о. подобный подход более надежен, чем предложенный Mikola, за что ему огромное спасибо. Вопросы, предложения, замечания на емайл. Всем спасибо.
Отправить личное сообщениеПрофиль пользователяWeb-сайт пользователяРоссия
Самара
Постов: 1
Нарушений: Нет
Пост #67194 от 27 мая 2010, 19:11 

gonzales

vlad45im : После недолгих мучений, было выяснено, что достаточно вызова RemoteCtrl.InitialQuick, вместо Initialize и DetectHW.
спасибо за коммент. тоже столкнулся с подобной проблеммой, единственный вопрос, при инициализации InitialQuick без запуска АверТВ программа будет работать?
Отправить личное сообщениеПрофиль пользователяРоссия
Москва
Постов: 7
Нарушений: Нет
Пост #67618 от 6 июля 2010, 09:17 

Rainstuff

кто-нибудь, кому не жалко - скиньте, пожалуйста, EvSink.pas на
Тоже хотел эту тему покопать.

Отредактировано: Rainstuff (08.07.2010-10:59, 685 дней назад)
Отправить личное сообщениеПрофиль пользователяКонфигурация пользователяРоссия
Н.Новгород
Постов: 30
Нарушений: Нет
Если Вы зарегистрированы, то для отправки сообщений, пожалуйста, авторизуйтесь.
-- ИЛИ --
Войдите, используя: Facebook Twitter Yandex Вконтакте Mail.ru ...
Страница создана за 0.524 секунды
Copyright © 1999-2012 PcTuner.Ru · Design by Alex Dovby