-
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) как отслеживать комбинации клавиш?
если событие нажатия клавиши А произошло после события нажатия клавиши Б, но до события отпускания клавиши Б, то клавиши А и Б нажаты одновременно. -
> [3] DiamondShark © (02.06.11 10:39)
> > 3) Если быстро набирать текст, то окажется, что он с глюками!
>
> Это потому что Балмер с Гейцем -- масоны, и хотят завоевать мирЪ.
Конечно, только тс-с-с - и мы завоюем, пока авторы будут вызывать два раза подряд функцию. -
wp2 (03.06.11 00:54) [5]DiamondShark спс, будем реализовывать.