Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить ReportID посылаемый HID клавиатурой 
:(
    Опции темы
Mozgunov
Дата 25.9.2012, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Уважаемые форумчане, не убивайте только сразу. Объясняю как могу)) У меня есть игровая клавиатура, которая при подключении параллельно основной полностью дублирует ввод. На этой клавиатуре есть мультимедийные клавиши, которые при опросе программой в демо папке компонента JvHID возвращают Report-ID. При опросе остальных клавиш программа молчит. Вопрос такой: Можно ли изменить репорт стандартных клавиш на свой (произвольный репорт, по аналогии репорта мультимедийной клавиши), который я буду перехватывать в своей программе при помощи компонента JvHID. Спасибо.
P.S. Если это сделать не реально-напишите. Не проходите мимо темы. Спасибо.

Это сообщение отредактировал(а) Mozgunov - 25.9.2012, 21:13
PM MAIL   Вверх
xvr
Дата 26.9.2012, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Вы можете в своей программе присосаться к любой клавиатуре и читать с нее все, что она передает. Читать на тему Raw Input
Поменять что либо в уже готовой клавиатуре IMHO нереально

PM MAIL   Вверх
Mozgunov
Дата 26.9.2012, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



А не подскажите, если ставить хук, то Raw Input сработает раньше или позже? В описании сказано, что она работает "напрямую" с устройством. Спасибо.
PM MAIL   Вверх
xvr
Дата 26.9.2012, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Mozgunov @  26.9.2012,  18:40 Найти цитируемый пост)
А не подскажите, если ставить хук, то Raw Input сработает раньше или позже? 

Раньше. Но если хук ставили в одном thread'е, а RawInput приходит в другом, то порядок срабатывания неопределен


PM MAIL   Вверх
Mozgunov
Дата 26.9.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Цитата(xvr @ 26.9.2012,  19:06)
Цитата(Mozgunov @  26.9.2012,  18:40 Найти цитируемый пост)
А не подскажите, если ставить хук, то Raw Input сработает раньше или позже? 

Раньше. Но если хук ставили в одном thread'е, а RawInput приходит в другом, то порядок срабатывания неопределен

Спасибо. Извините за глупый вопрос. А что такое thread? 
PM MAIL   Вверх
Mozgunov
Дата 26.9.2012, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



xvr, Помогите ещё одну проблемку решить. Мои ковыряния привели к такому коду(ниже). В переменной sss хранится строка из которой можно вытащить PID VID. Значения изменяются если я ввожу клавиши  с разных клавиатур, но всё это работает если активно окно моей программы. Как сделать так , чтобы вывод на форму шёл независимо от того какое окно сейчас активное. 


Код

unit klava_acad;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, HIDDefine, StdCtrls, InfoUtils, HIDDeviceInfo;

type
  TForm1 = class(TForm)
    Button1: TButton;
    DataMemo: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure WndProc(var Message: TMessage); override;
    procedure Test();
  private

    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  sss: AnsiString;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Test();
end;

procedure TForm1.Test;
var  Rid : TRawInputDevice;
begin
 Rid.UsagePage:= 1;
 Rid.Usage    := 6;
 Rid.Flags    := 0;
 Rid.Target   := GetForegroundWindow; //Self.Handle

 If RegisterRawInputDevices(@Rid, 1, sizeof(Rid))  then begin
 // ShowMessage('Ok');
end;
end;

procedure TForm1.WndProc(var Message: TMessage);
var i, dwSize : DWord; Data : Array of Byte; P : PRawInputRecord; B : Byte;
    S : String;  RidInfo : TRidDeviceInfo; pcbSize : DWord;
    HidHandle : THandle;
begin
 Inherited WndProc(Message);

 // Îáðàáàòûâàåì ñîîáùåíèå WM_INPUT
 If Message.Msg = WM_INPUT then begin
  // Ñíà÷àëà ïåðåäàåì íóëåâîé áóôåð, ÷òîáû óçíàòü
  // íåîáõîäèìûé ðàçìåð áóôåðà
  GetRawInputData(Message.lParam, RID_INPUT, nil, dwSize, sizeof(TRawInputHeader));

  // Ñîçäàåì áóôåð
  SetLength(Data, dwSize);

  // Ïîëó÷àåì äàííûå
  If GetRawInputData(Message.lParam, RID_INPUT, Data, dwSize, sizeof(TRawInputHeader)) then begin
    P:= PRawInputRecord(@Data[0]);

    HidHandle:= P^.Header.hDevice;

    S:= Format('MakeCode=%d VKey=%d Message=%d', [
             P^.Keyb.MakeCode,
             P^.Keyb.VKey,
             P^.Keyb.Message
          ]);

    DataMemo.Text:= S;
  End else begin
   // Åñëè îøèáêà...
   ShowMessage ('Îøèáêà1');
   Exit;
  End;
 end;


 pcbSize:= SizeOf(RidInfo);
 FillChar(RidInfo, SizeOf(RidInfo), 0);
 RidInfo.cbSize:= pcbSize;

      // Ïîëó÷èòü ðàçìåð áóôåðà, íåîáõîäèìûé äëÿ õðàíåíèÿ èìåíè óñòðîéñòâà
     GetRawInputDeviceInfoA(HidHandle, RIDI_DEVICENAME, nil, pcbSize);
     // Ñîçäàåì áóôåð
     SetLength(Data, pcbSize);
     // Ïîëó÷èòü èìÿ óñòðîéñòâà
     If GetRawInputDeviceInfoA(HidHandle, RIDI_DEVICENAME, Data, pcbSize) then begin
      //AddInfoLineStr('RidInfo.DeviceName', StrPas(@Data[0]));
      sss:=StrPas(@Data[0]);
      SetLength(sss, 100);
      label1.Caption:=sss;
      end;

      end;

end.






Я подозреваю что нужно менять  Rid.Target  и перезапускать процедуру клика, но что-то не получается...(((

Это сообщение отредактировал(а) Mozgunov - 26.9.2012, 23:56
PM MAIL   Вверх
xvr
Дата 27.9.2012, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Mozgunov @  26.9.2012,  19:15 Найти цитируемый пост)
 А что такое thread?  

'Нить'. Параллельно исполняющийся поток в вашей (или чужой) программе.

Цитата(Mozgunov @  26.9.2012,  23:02 Найти цитируемый пост)
 Как сделать так , чтобы вывод на форму шёл независимо от того какое окно сейчас активное. 

Может не получиться  smile 
В любом случае попробуйте дать флаг RIDEV_INPUTSINK в Rid.Flags.

Цитата(Mozgunov @  26.9.2012,  23:02 Найти цитируемый пост)
Я подозреваю что нужно менять  Rid.Target  и перезапускать процедуру клика, 

Это не надо

PM MAIL   Вверх
Mozgunov
Дата 27.9.2012, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



Цитата(xvr @ 27.9.2012,  06:51)
Цитата(Mozgunov @  26.9.2012,  19:15 Найти цитируемый пост)
 А что такое thread?  

'Нить'. Параллельно исполняющийся поток в вашей (или чужой) программе.

Цитата(Mozgunov @  26.9.2012,  23:02 Найти цитируемый пост)
 Как сделать так , чтобы вывод на форму шёл независимо от того какое окно сейчас активное. 

Может не получиться  smile 
В любом случае попробуйте дать флаг RIDEV_INPUTSINK в Rid.Flags.

Цитата(Mozgunov @  26.9.2012,  23:02 Найти цитируемый пост)
Я подозреваю что нужно менять  Rid.Target  и перезапускать процедуру клика, 

Это не надо

xvr, Спасибо большущее!! Сработало. Данные  с PID VID выводятся на этикетку.С хуком не успел попробовать (что раньше сработает). 

Ничего не получается((( Хук срабатывает раньше(хоть и написано что обращение Raw Input идёт напрямую )

Это сообщение отредактировал(а) Mozgunov - 28.9.2012, 17:40
PM MAIL   Вверх
Mozgunov
Дата 29.9.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



стерто

Это сообщение отредактировал(а) Mozgunov - 29.9.2012, 13:01
PM MAIL   Вверх
Mozgunov
Дата 30.9.2012, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



xvr, А скажите в какое именно место нужно поставить хук чтобы RawInput сработала раньше. Как я понял, что при отлове нажатия в WndProc код клавиши уже отправен системе и обратно его не вернуть, а если ставить хук раньше, то не поймать клавишу потому, что на неё сработал хук. Как это сделать? в одну нить... Спасибо.
PM MAIL   Вверх
xvr
Дата 30.9.2012, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Mozgunov @  30.9.2012,  11:24 Найти цитируемый пост)
Как я понял, что при отлове нажатия в WndProc код клавиши уже отправен системе и обратно его не вернуть,

Если вам надо отлавливать коды с вашего девайса в эксклюзивном режиме (что бы в другие приложения они не попали), то ставьте флаг RIDEV_NOLEGACY (ну и RIDEV_NOHOTKEYS для комплекта). 

Цитата(Mozgunov @  30.9.2012,  11:24 Найти цитируемый пост)
 А скажите в какое именно место нужно поставить хук чтобы RawInput сработала раньше.

Она срабатывает раньше, но после нее клавиша продолжает обрабатываться обычным способом (если не был установлен вышеупомянутый флаг  RIDEV_NOLEGACY), и повлиять на это вы не сможете

PM MAIL   Вверх
Mozgunov
Дата 30.9.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



xvr, 

поставил эти флаги:
Код

Rid.Flags := RIDEV_INPUTSINK or RIDEV_NOLEGACY or RIDEV_NOHOTKEYS;


Правильно?

Для моей программы всё работает отлично. Если пытаюсь ввести в мемо текст, то символ не отсылается но функция информирует меня о нажатой или отпущенной клавиши, но если только я перехожу в другое приложение, то символ в него отправляется.

Скажите, процедуре RegisterRawInputDevices для чего нужен хендл? Может быть у меня срабатывает только в Form1 потому, что я RegisterRawInputDevices вызывал c Rid.Target := Self.Handle; ? Как бы сделать так чтобы блокировался ввод клавиш во всех приложениях, а не только в Форм1.



Это сообщение отредактировал(а) Mozgunov - 30.9.2012, 21:48
PM MAIL   Вверх
xvr
Дата 1.10.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Mozgunov @  30.9.2012,  13:23 Найти цитируемый пост)
Может быть у меня срабатывает только в Form1 потому, что я RegisterRawInputDevices вызывал c Rid.Target := Self.Handle; ?

Угу, так и есть

Цитата(Mozgunov @  30.9.2012,  13:23 Найти цитируемый пост)
Как бы сделать так чтобы блокировался ввод клавиш во всех приложениях, а не только в Форм1.

Raw Input не предназначен для перехвата ввода с устройства глобально (по всем Windows'ам). Он обеспечивает прямой доступ к устройству для конкретного приложения, которое хочет получать не переваренные Windows данные устройства, а читать их напрямую.

Так что глобальный перехват работать скорее всего не будет  smile 

Вам надо записать в Rid.Target NULL, но система все равно будет обрабатывать Raw Input только в вашем приложении (и отправлять его текущему окну вашего приложения)



PM MAIL   Вверх
Mozgunov
Дата 1.10.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.9.2012

Репутация: нет
Всего: нет



А нельзя как нибудь повесить хендл на другую программу (допустим "блокнот") при регистрации RegisterRawInputDevices? Я пробовал. У меня не получилось. Может как-то можно? То есть не глобально, а на конкретную. Можно было бы тогда по таймеру получать активное окно, узнавать его хендл, ставить его на прослушку этой функцией и блокировать ввод именно в него ("Блокнот").
xvr, Всё же хук почему-то раньше срабатывает(((...

Это сообщение отредактировал(а) Mozgunov - 1.10.2012, 13:27
PM MAIL   Вверх
xvr
Дата 1.10.2012, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Mozgunov @  1.10.2012,  12:02 Найти цитируемый пост)
А нельзя как нибудь повесить хендл на другую программу (допустим "блокнот") при регистрации RegisterRawInputDevices? 

Это можно сделать только изнутри этой самой 'другой программы'. А для этого в нее придется инжектить свою dll. А потом бороться с антивирусами, т.к. они начнут хором орать на такое действие  smile 

Цитата(Mozgunov @  1.10.2012,  12:02 Найти цитируемый пост)
Всё же хук почему-то раньше срабатывает(((...

Посмотрите опции в RegisterRawInputDevices и выставите все, которые блокируют обычную обработку Windows. Хук должен отвалиться

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0548 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.