Как различить дублирующиеся клавиши

Тема в разделе "WASM.WIN32", создана пользователем Egorgiy, 27 авг 2004.

Статус темы:
Закрыта.
  1. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    Как различить дублирующиеся клавиши



    На клавиатуре есть дублирующиеся кнопки:

    Например "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"
     
  2. __Ranger

    __Ranger New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2003
    Сообщения:
    23
    Адрес:
    Russia
    Не знаю, что там в делфи приходит в "Key", но в DOS'e ты бы получил два байта - префикс скан кода и расширенный ASCII код. Попробуй GetKeyState(VK_NUMPAD8). Хотя, наверноё, на keyup'e не прокатит.
     
  3. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    А если посмотреть на какой-нибудь готовый кейлоггер на Delphi? Там ведь как-то различают все клавиши...
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Egorgiy



    Напоминаю, в форуме никакого Delphi!
     
  5. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    volodya

    Ок! никаких делфей!

    Согласен на Asm :)



    __Ranger

    Стало быть вышеприведенный asm код по идее правильный...

    Мож просто где-то теряется в интерпретаторе,

    действительно у меня расширенный код всегда 0.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Не путайте SHORT GetKeyState(int nVirtKey) и BOOL GetKeyboardState(PBYTE lpKeyState)

    Последняя заполняет масиив 256 байтов - для каждой кнопки отдельно состояение - нажата \ не нажата.
     
  7. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    Да я сравнивал все 256 байтов этих массивов и все равно да же тогда результаты те же.



    Чего то я не смог пока найти готовую прогу (код) на ассемблере, для моего случая, сдается мне что код который я привел выше не совсем то.
     
  8. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    С 21ым прерыванием вообще какие-то проблемы, кругом приведены примеры лишь с куском кода....
     
  9. zed_0xff

    zed_0xff New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    29
    Я так понимаю прога то виндовая? Тогда вообще причем тут вышеприведенный код на асме?? он ведь на дос рассчитан.. и порты тут и прерывания..

    А вообще попробуй повешаться на WM_KEYDOWN напрямую - там много интересных параметров.
     
  10. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    Легко сказать вешайся....

    Пожалуй там привесишься....
     
  11. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
    При нажатии на "Numpad8" возникает событие WM_KEYDOWN с lParam == 00480001h при любом состоянии NumLock. Клавиша "Up" дает 01480001h.
     
  12. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    Но как отловить WM_KEYDOWN в делфях (да простит меня Volodya), там все завязано на OnKeyDown.

    Щас полезу по делфийским сайтам.....
     
  13. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    Это просто мысли вслух :)
     
  14. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    Кажется нашел!

    Пошел проверять!
     
  15. vinnie_pooh

    vinnie_pooh New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2004
    Сообщения:
    98
  16. Egorgiy

    Egorgiy New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    31
    Адрес:
    Russia
    Спасибо всем!

    Отлично работает с WM_KEYDOWN...

    Тему прикрываю.
     
Статус темы:
Закрыта.