Как различить дублирующиеся клавиши На клавиатуре есть дублирующиеся кнопки: Например "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"
Не знаю, что там в делфи приходит в "Key", но в DOS'e ты бы получил два байта - префикс скан кода и расширенный ASCII код. Попробуй GetKeyState(VK_NUMPAD8). Хотя, наверноё, на keyup'e не прокатит.
А если посмотреть на какой-нибудь готовый кейлоггер на Delphi? Там ведь как-то различают все клавиши...
volodya Ок! никаких делфей! Согласен на Asm __Ranger Стало быть вышеприведенный asm код по идее правильный... Мож просто где-то теряется в интерпретаторе, действительно у меня расширенный код всегда 0.
Не путайте SHORT GetKeyState(int nVirtKey) и BOOL GetKeyboardState(PBYTE lpKeyState) Последняя заполняет масиив 256 байтов - для каждой кнопки отдельно состояение - нажата \ не нажата.
Да я сравнивал все 256 байтов этих массивов и все равно да же тогда результаты те же. Чего то я не смог пока найти готовую прогу (код) на ассемблере, для моего случая, сдается мне что код который я привел выше не совсем то.
Я так понимаю прога то виндовая? Тогда вообще причем тут вышеприведенный код на асме?? он ведь на дос рассчитан.. и порты тут и прерывания.. А вообще попробуй повешаться на WM_KEYDOWN напрямую - там много интересных параметров.
При нажатии на "Numpad8" возникает событие WM_KEYDOWN с lParam == 00480001h при любом состоянии NumLock. Клавиша "Up" дает 01480001h.
Но как отловить WM_KEYDOWN в делфях (да простит меня Volodya), там все завязано на OnKeyDown. Щас полезу по делфийским сайтам.....