Сейчас на форуме: tyns777 (+5 невидимых) |
eXeL@B —› Программирование —› Как определить на какой из двух клавиатур нажали клавишу? |
Посл.ответ | Сообщение |
|
Создано: 11 апреля 2010 17:18 · Личное сообщение · #1 |
|
Создано: 11 апреля 2010 18:15 · Поправил: NikolayD · Личное сообщение · #2 |
|
Создано: 11 апреля 2010 19:41 · Личное сообщение · #3 |
|
Создано: 11 апреля 2010 22:17 · Личное сообщение · #4 Isaev пишет: Хочешь в 2 раза больше клавиш иметь? Ну да, что бы в ворде печатать в 2 раза быстрее... Сейчас информации нашел много, почитал, понял, что придется работать с драйвером на прямую как и советовал NikolayD. Задача получать коды клавиш именно с PS/2 клавиатуры. Придётся взаимодействовать с драйвером i8042prt. В статье www.wasm.ru/print.php?article=drvw2k16 даны примеры работы и исходники фильтра, который как раз и ловит только с ps/2 клавиатуры. USB не мониторится. Правда мне придётся работать с драйвером из дельфи, а опыта такого не было... Isaev пишет: А для чего это надо? Некое устройство работает через контроллер клавиатуры. Клавиатура без кнопок... Возникла необходимость в подключении полноценной клавиатуры, но естественно нажатия её кнопок не должны путаться с посылками устройства... |
|
Создано: 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 клавиатуре или нет. |
|
Создано: 12 апреля 2010 12:53 · Личное сообщение · #6 |
|
Создано: 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. Попробую реализацию и отпишу о результате. |
|
Создано: 12 апреля 2010 15:41 · Поправил: ToBad · Личное сообщение · #8 Выяснилось, что не у всех есть в системе inpout32.dll... Ну а так работает! Вот что получилось: Code:
p.s. Конечно корректно работать будет только для части сканкодов, которые менее 255. |
|
Создано: 13 апреля 2010 12:51 · Личное сообщение · #9 |
|
Создано: 13 апреля 2010 14:44 · Личное сообщение · #10 Clerk пишет: но юзать железо непосредственно из юзермода через порты это изврат. Этим драйвера должны заниматься. Я подозреваю, что inpout32.dll делает это через драйвера и по всем правилам. Конечно да, писать в порты и делать что-то серьёзное я возможно тоже бы не стал таким способом, но просто прочитать изредка что там за значение думаю не грешно... К тому же для такой примитивной задачи как у меня и на дельфи, большим бы извратом было писать драйвер... Clerk пишет: Я бы например такое приложение не рискнул бы запустить у себя, только если в виртуалке Есть подозрения, что будет глючить? |
|
Создано: 13 апреля 2010 23:36 · Личное сообщение · #11 |
|
Создано: 14 апреля 2010 00:02 · Поправил: Clerk · Личное сообщение · #12 |
|
Создано: 23 апреля 2010 01:10 · Личное сообщение · #13 Встроил код который указал 5-ю постами выше в сервис. Проверил, у меня отлично работает. Однако на другом компьютере сервис в упор отказывается запускаться, пока не выкину код работы с inpout32.dll Далее запихнул вызов Inp32 в функцию находящуюся в длл, подгружаю динамически. Сервис запускается, однако функция не работает. В тоже время на том же компе тестовая программа использующая inpout32.dll - работает без проблем. Есть ли какие нибудь причины почему на этом компьютере из сервиса или из длл подгруженной им невозможно воспользоваться этой библиотекой? |
|
Создано: 23 апреля 2010 08:12 · Личное сообщение · #14 |
|
Создано: 23 апреля 2010 14:34 · Личное сообщение · #15 Valemox пишет: Может все дело в AdjustTokenPrivileges? Возможно... Я мало знаю о привилегиях, сейчас читаю, но сразу вопрос появляется, а какие привилегии на загрузку длл использующею порты из сервиса могут быть отключены? Что за это может отвечать и разве у сервиса стартующего от пользователя SYSTEM могут быть ограничения по привилегиям? p.s. Проверил ещё на одном компе - без проблем. Подозреваю, что не в порядке что-то именно с виндой, так как под админом не мог зайти в таскменеджер по ctrl-alt-del пока не поправил в реестре. Думаю последствия вируса... Понимаю, что проще всего переустановить винду и не мучатся, но вариант поправить что-то в сервисе, что бы не напороться на эти грабли в следующий раз - очень заманчивый. |
|
Создано: 23 апреля 2010 15:58 · Поправил: Valemox · Личное сообщение · #16 |
|
Создано: 24 апреля 2010 02:28 · Личное сообщение · #17 |
eXeL@B —› Программирование —› Как определить на какой из двух клавиатур нажали клавишу? |