Конференция "WinAPI" » консольное приложение. Перехват клавиш.
 
  • wp2 (01.06.11 14:29) [0]
    Нашел информацию, что для перехвата клавиш используется функция ReadConsoleInput.

    Написал простенький пример:

    program Project2;
    {$APPTYPE CONSOLE}
    uses  SysUtils,  Windows;

    var  r: Cardinal;
         gc: INPUT_RECORD;
         handle: THANDLE;
    begin
        handle := GetStdHandle(STD_INPUT_HANDLE);
        while true do
        begin
    ReadConsoleInput(handle, gc, 1, r);
               Write(Chr(gc.Event.KeyEvent.wVirtualKeyCode));
        end;
    end.



    и тут возникла гора вопросов...

    1) почему дублируются вводимые символы? Одно нажатие клавиш генерирует 2 события! Которые 2 раза ловятся функцией ReadConsoleInput.

    поэтому я делаю сразу аж два вызова функции:

    begin
    ReadConsoleInput(handle, gc, 1, r);
              ReadConsoleInput(handle, gc, 1, r);
               Write(Chr(gc.Event.KeyEvent.wVirtualKeyCode));
    end;


    вроде помогает...

    2) почему при наборе букв используются только большие буквы? Это что, надо самому отслеживать нажатие CapsLock и Shift?

    3) Если быстро набирать текст, то окажется, что он с глюками!

    4) как отслеживать комбинации клавиш?
  • clickmaker © (01.06.11 15:04) [1]
    1) чем отличаются символы?
    2) потому что это virtual key code, он не зависит от регистра. См. KEY_EVENT_RECORD.AsciiChar
    3) с какими?
    4) KEY_EVENT_RECORD.dwControlKeyState
  • wp2 (01.06.11 17:45) [2]
    1) ничем. Можете сами мой пример запустить, посмотрите что будет.
    3) например, если быстро нажать 1234, то на экране что-то вроде 1134
  • DiamondShark © (02.06.11 10:39) [3]

    > 1) почему дублируются вводимые символы?

    Потому что нажатие и отпускание -- это два события.


    > 2) почему при наборе букв используются только большие буквы?

    Потому что это не буквы, а клавиши. На клавиатуре только один набор клавиш.


    > 3) Если быстро набирать текст, то окажется, что он с глюками!

    Это потому что Балмер с Гейцем -- масоны, и хотят завоевать мирЪ.


    > 4) как отслеживать комбинации клавиш?

    если событие нажатия клавиши А произошло после события нажатия клавиши Б, но до события отпускания клавиши Б, то клавиши А и Б нажаты одновременно.
  • Inovet © (02.06.11 10:58) [4]
    > [3] DiamondShark ©   (02.06.11 10:39)
    > > 3) Если быстро набирать текст, то окажется, что он с глюками!
    >
    > Это потому что Балмер с Гейцем -- масоны, и хотят завоевать мирЪ.

    Конечно, только тс-с-с - и мы завоюем, пока авторы будут вызывать два раза подряд функцию.
  • wp2 (03.06.11 00:54) [5]
    DiamondShark спс, будем реализовывать.
 
Конференция "WinAPI" » консольное приложение. Перехват клавиш.
Есть новые Нет новых   [134431   +11][b:0][p:0.001]