|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 27, 2004 15:57:23 Как различить дублирующиеся клавиши На клавиатуре есть дублирующиеся кнопки: Например "Up" (клавиша управления курсором) и "Numpad8" (на цифровой клаве) (физически это разные кнопки) Мне необходимо чтобы моя программа (на Delphi) различала эти кнопки А в жизни получаю: При нажатой "NumLock" скан-коды клавиш "Up" и "Numpad8" разные, оно конечно понятно. При отжатой кнопке "NumLock" скан-коды клавиш "Up" и "Numpad8" совпадают. Конечно эти кнопки при отжатой "NumLock" друг друга дублируют, но повторяю - эти кнопки физически все-таки разные (если распайку не смотреть) Но как-то ведь можно различить эти кнопки Обработку нажатой клавиши веду по событию KeyUp: procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Юзал следующие функции: MapVirtualKey Scancode:=MapVirtualKey(cardinal(key),0); и GetKeyboardState и все равно та же фигня Key=38 для "Up" Key=38 для "Numpad8" Key=104 для "Numpad8" (нажата "NumLock") Scancode=72 для "Up" Scancode=72 для "Numpad8" (не зависимо от "NumLock") В разной литературе я видел разные данные: Scancode=72 для "Up" и для "Numpad8" и Scancode=328 для "Up" т.е разница на пресловутые 256 Встраивал Asm код в тело своей процедуры - результат тот же. asm @1: in al,60h and al,al jns @1 @2: in al,60h and al,al js @2 xor ah,ah push ax mov ah,11h int 16h jz @3 mov ah,10h int 16h @3: pop ax end; Может я чего-то недопонимаю или путаю кислое с соленым (как то скан код и виртуальный код или ASCII код), просветите... А то я голову сломал уже копаясь в MSDN и интернете. P.S. Кстати в одной программе (игруха) эти кнопки кодируются по разному: "Up" - "0х6400" "Numpad8" -"0х2400" Очень интересно если учесть что скан код "Numpad8" - 72="0х4800" вдвое больше "0х2400" но откуда тогда "0х6400" для "Up" |
|
|
Дата: Авг 27, 2004 16:32:59 · Поправил: __Ranger Не знаю, что там в делфи приходит в "Key", но в DOS'e ты бы получил два байта - префикс скан кода и расширенный ASCII код. Попробуй GetKeyState(VK_NUMPAD8). Хотя, наверноё, на keyup'e не прокатит. |
|
|
Дата: Авг 27, 2004 19:10:08 А если посмотреть на какой-нибудь готовый кейлоггер на Delphi? Там ведь как-то различают все клавиши... |
|
|
Дата: Авг 27, 2004 19:36:14 Egorgiy Напоминаю, в форуме никакого Delphi! |
|
|
Дата: Авг 27, 2004 20:20:48 volodya Ок! никаких делфей! Согласен на Asm :-) __Ranger Стало быть вышеприведенный asm код по идее правильный... Мож просто где-то теряется в интерпретаторе, действительно у меня расширенный код всегда 0. |
|
|
Дата: Авг 28, 2004 04:15:37 Не путайте SHORT GetKeyState(int nVirtKey) и BOOL GetKeyboardState(PBYTE lpKeyState) Последняя заполняет масиив 256 байтов - для каждой кнопки отдельно состояение - нажата \ не нажата. |
|
|
Дата: Авг 28, 2004 11:23:57 Да я сравнивал все 256 байтов этих массивов и все равно да же тогда результаты те же. Чего то я не смог пока найти готовую прогу (код) на ассемблере, для моего случая, сдается мне что код который я привел выше не совсем то. |
|
|
Дата: Авг 28, 2004 11:26:25 С 21ым прерыванием вообще какие-то проблемы, кругом приведены примеры лишь с куском кода.... |
|
|
Дата: Авг 28, 2004 12:45:24 Я так понимаю прога то виндовая? Тогда вообще причем тут вышеприведенный код на асме?? он ведь на дос рассчитан.. и порты тут и прерывания.. А вообще попробуй повешаться на WM_KEYDOWN напрямую - там много интересных параметров. |
|
|
Дата: Авг 28, 2004 13:12:13 Легко сказать вешайся.... Пожалуй там привесишься.... |
|
|
Дата: Авг 28, 2004 17:28:31 · Поправил: vinnie_pooh При нажатии на "Numpad8" возникает событие WM_KEYDOWN с lParam == 00480001h при любом состоянии NumLock. Клавиша "Up" дает 01480001h. |
|
|
Дата: Авг 28, 2004 20:26:47 Но как отловить WM_KEYDOWN в делфях (да простит меня Volodya), там все завязано на OnKeyDown. Щас полезу по делфийским сайтам..... |
|
|
Дата: Авг 28, 2004 20:30:30 Это просто мысли вслух :-) |
|
|
Дата: Авг 28, 2004 20:33:37 Кажется нашел! Пошел проверять! |
|
|
Дата: Авг 28, 2004 20:34:36 · Поправил: vinnie_pooh :=) |