· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Как различить дублирующиеся клавиши

. 1 . 2 . >>

Посл.отвђт Сообщен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

:=)

. 1 . 2 . >>