Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Как определить на какой из двух клавиатур нажали клавишу?
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 11 апреля 2010 17:18
· Личное сообщение · #1

Если к компьютеру подключено 2 клавиатуры, PS/2 и USB - возможно ли определить, что определённая клавиша была нажата именно на PS/2? Насколько знаю стандартные функции для работы с клавиатурой не позволяют это сделать...



Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 11 апреля 2010 18:15 · Поправил: NikolayD
· Личное сообщение · #2

www.wasm.ru/forum/viewtopic.php?id=36897 так как это разные дрова в качестве бредовой фантазии предположу что можно установить какойнить обработчик на эти дрова или хз как там оно называется, и соответственно будем знать на какой клаве было нажато.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 11 апреля 2010 19:41
· Личное сообщение · #3

Ну да, видимо только за дрова и можно уцепиться, т.к. для системы это всего лишь устройство ввода
А для чего это надо? Хочешь в 2 раза больше клавиш иметь? ))

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 11 апреля 2010 22:17
· Личное сообщение · #4

Isaev пишет:
Хочешь в 2 раза больше клавиш иметь?


Ну да, что бы в ворде печатать в 2 раза быстрее...

Сейчас информации нашел много, почитал, понял, что придется работать с драйвером на прямую как и советовал NikolayD. Задача получать коды клавиш именно с PS/2 клавиатуры. Придётся взаимодействовать с драйвером i8042prt.
В статье www.wasm.ru/print.php?article=drvw2k16 даны примеры работы и исходники фильтра, который как раз и ловит только с ps/2 клавиатуры. USB не мониторится.
Правда мне придётся работать с драйвером из дельфи, а опыта такого не было...

Isaev пишет:
А для чего это надо?


Некое устройство работает через контроллер клавиатуры. Клавиатура без кнопок... Возникла необходимость в подключении полноценной клавиатуры, но естественно нажатия её кнопок не должны путаться с посылками устройства...




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 11 апреля 2010 23:14 · Поправил: ToBad
· Личное сообщение · #5

В ходе поиска набрел на интересный сайт www.pcports.ru/xDRV_sys.php. Вот что пишет автор о своём творении: Драйвер xDRV.sys может свободно "общаться" с любым портом Вашего ПК (запись/чтение данных) под управлением ОС Windows NT, 2000, XP
На практике, в демонстрационном коде на Дельфи я меняю порт $378 на $60, кручу в потоке и вывожу результат. Получаю два скан кода на одно нажатие кнопочки. При нажатии и при отпускании.
Пробел 39 - B9
1 02 - 82
2 03 - 83
F1 3B - BB
F12 58 - D8
Esc 01 - 81
Enter 1C - 9C
Правда второй код остаётся на порту... В общем не для полной эмуляции конечно клавиатуры, а для десятка клавиш можно написать что-то подобное GetAsyncKeyState, только для порта $60, а значит именно для PS/2 клавиатуры.
Как думаете, нормальный вариант?

p.s. Проверил в момент чтения с порта работу функции GetAsyncKeyState, когда например GetAsyncKeyState(VK_F12) не ноль, то на порту 58. А значит если перевести виртуальный код в скан код и читать значение с порта в момент вызова GetAsyncKeyState - то можно знать была нажата клавиша фактически на PS/2 клавиатуре или нет.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 12 апреля 2010 12:53
· Личное сообщение · #6

Еще inpout32.dll в юзермоде можно попробовать. Там всего 2 ф-ции: inp32 и out32... А еще лучше, я думаю, навести Вас на реверс виндовой kbd_event(), GetRawInputData() и вытащить что надо. Коды для DeviceIoControl или что-нить в этом духе должно вытащиться...

-----
IZ.RU





Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 12 апреля 2010 14:34 · Поправил: ToBad
· Личное сообщение · #7

DenCoder пишет:
Еще inpout32.dll в юзермоде можно попробовать. Там всего 2 ф-ции: inp32 и out32...


О, супер! Принцип тот же, что и xDRV, только не нужно стартовать драйвер и останавливать его, да и длл в винде уже есть.

DenCoder пишет:
GetRawInputData() и вытащить что надо


Да, можно и так, нашёл как человек получает событие от мышки определяя на какой из двух была нажата кнопка. Если кому интересно pda.delphimaster.net/?id=1241950542&n=5.

В принципе под мою задачу, а если конкретизировать, то тему я должен был назвать так: "получение GetAsyncKeyState только от PS/2 клавиатуры" - самый идеальный и простой это вариант с чтением из порта.
Теперь осталось спросить гугла на тему конвертации виртуального кода клавиши в скан код.
p.s. Ага, нашёл MapVirtualKey.

Попробую реализацию и отпишу о результате.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 12 апреля 2010 15:41 · Поправил: ToBad
· Личное сообщение · #8

Выяснилось, что не у всех есть в системе inpout32.dll... Ну а так работает!
Вот что получилось:
Code:
  1. function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll';
  2.  
  3. Function GetAsyncKeyStatePS2(vKey: Integer): SHORT; stdcall;
  4. begin
  5. if Inp32($60)=MapVirtualKey(vKey,0) then Result:=GetAsyncKeyState(vKey) else Result:=0;
  6. end;


p.s. Конечно корректно работать будет только для части сканкодов, которые менее 255.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 13 апреля 2010 12:51
· Личное сообщение · #9

ToBad
Не знаю как эту задачу решить со стороны юзермода, но юзать железо непосредственно из юзермода через порты это изврат. Этим драйвера должны заниматься. Я бы например такое приложение не рискнул бы запустить у себя, только если в виртуалке




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 13 апреля 2010 14:44
· Личное сообщение · #10

Clerk пишет:
но юзать железо непосредственно из юзермода через порты это изврат. Этим драйвера должны заниматься.


Я подозреваю, что inpout32.dll делает это через драйвера и по всем правилам. Конечно да, писать в порты и делать что-то серьёзное я возможно тоже бы не стал таким способом, но просто прочитать изредка что там за значение думаю не грешно... К тому же для такой примитивной задачи как у меня и на дельфи, большим бы извратом было писать драйвер...

Clerk пишет:
Я бы например такое приложение не рискнул бы запустить у себя, только если в виртуалке


Есть подозрения, что будет глючить?




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 13 апреля 2010 23:36
· Личное сообщение · #11

Оно к портам под nt-ями через посредственный драйвер hwinterface.sys обращается при помощи DeviceIoControl. Так что если аккуратно, то ничего страшного. К LPT и COM-портам свободно можно обращаться...

Но лучше все-таки GetRawInputData()...

-----
IZ.RU




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 14 апреля 2010 00:02 · Поправил: Clerk
· Личное сообщение · #12

Разумеется, либа и дров весьма старые и опенсурсные ведь.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 23 апреля 2010 01:10
· Личное сообщение · #13

Встроил код который указал 5-ю постами выше в сервис. Проверил, у меня отлично работает. Однако на другом компьютере сервис в упор отказывается запускаться, пока не выкину код работы с inpout32.dll
Далее запихнул вызов Inp32 в функцию находящуюся в длл, подгружаю динамически. Сервис запускается, однако функция не работает. В тоже время на том же компе тестовая программа использующая inpout32.dll - работает без проблем. Есть ли какие нибудь причины почему на этом компьютере из сервиса или из длл подгруженной им невозможно воспользоваться этой библиотекой?



Ранг: 116.5 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 23 апреля 2010 08:12
· Личное сообщение · #14

Может все дело в AdjustTokenPrivileges?




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 23 апреля 2010 14:34
· Личное сообщение · #15

Valemox пишет:
Может все дело в AdjustTokenPrivileges?


Возможно... Я мало знаю о привилегиях, сейчас читаю, но сразу вопрос появляется, а какие привилегии на загрузку длл использующею порты из сервиса могут быть отключены? Что за это может отвечать и разве у сервиса стартующего от пользователя SYSTEM могут быть ограничения по привилегиям?

p.s. Проверил ещё на одном компе - без проблем. Подозреваю, что не в порядке что-то именно с виндой, так как под админом не мог зайти в таскменеджер по ctrl-alt-del пока не поправил в реестре. Думаю последствия вируса... Понимаю, что проще всего переустановить винду и не мучатся, но вариант поправить что-то в сервисе, что бы не напороться на эти грабли в следующий раз - очень заманчивый.



Ранг: 116.5 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 23 апреля 2010 15:58 · Поправил: Valemox
· Личное сообщение · #16

ToBad пишет:
у сервиса стартующего от пользователя SYSTEM могут быть ограничения по привилегиям?

Значит, это не из-за привилегий, т.к. по дефолту у system-сервиса они уже должны быть.
По поводу той хромой винды, то кажись, для нее не в сервисе надо чота править, а скорее ее реестру молитву читать.




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 24 апреля 2010 02:28
· Личное сообщение · #17

Valemox пишет:
По поводу той хромой винды, то кажись, для нее не в сервисе надо чота править, а скорее ее реестру молитву читать.


Да, переустановка помогла. Так проще.

p.s. Прошу тему не закрывать, планирую в течении недельки ещё потестировать на разных компах, возможно что-то всплывёт...


 eXeL@B —› Программирование —› Как определить на какой из двух клавиатур нажали клавишу?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати