Отслеживание событий клавиш в CRT - PascalABC.NET
Формулировка задачи:
В GraphABC есть такая возможность OnKeyDown и OnKeyUp, как примерно такое реализовать в модуле CRT. Следить нужно только за одним пробелом. Задача, понять, когда пробел "нажат и удержан" и когда он "отпущен".
Мои мысли: когда мы жмем пробел, то в строке сначала появляется один пробел, потом через 320 - 360 мс компьютер проверяет все еще нажат ли пробел, если да то он начинает штамповать пробелы через 10 - 60 мс (среднее значение из моих исследований), если же пробел после первого нажатия не зажат (пробел не появляется в течении 350 - 400 мс). Это как отслеживать нажатие и удержание. Вот как понять отпущен ли пробел: если мы зажали его, то пробелы начали появляться через 10 - 60 мс, в какой-то момент вдруг пробел не появился в течении этого промежутка, все, значит пробел отпущен.
Вот только с реализацией проблемы.
Решение задачи: «Отслеживание событий клавиш в CRT»
textual
Листинг программы
uses crt; function GetKeyState(nVirtKey: integer): smallint; external 'User32.dll'; procedure StopWhileSpacePressed; var pressed : word; begin repeat sleep(1); pressed := GetKeyState(32); until pressed and $8000 = 0; writeln('Space key released'); end; var i : integer; begin for i := 1 to 20 do begin writeln(i); if KeyPressed and (ReadKey = #32) then StopWhileSpacePressed; sleep(500); end; end.
Объяснение кода листинга программы
- Объявлены используемые модули и функция: uses crt; function GetKeyState(nVirtKey: integer): smallint; external 'User32.dll';
- Объявлена процедура StopWhileSpacePressed с переменной pressed типа word и переменной nVirtKey типа integer.
- В основной программе объявлена переменная i типа integer с диапазоном от 1 до 20.
- В цикле от 1 до 20 выводится значение переменной i.
- Проверяется, нажата ли клавиша пробела (ReadKey = #32), и если да, то вызывается процедура StopWhileSpacePressed.
- Программа
спит
в течение 500 миллисекунд (sleep(500)). - После завершения цикла выводится сообщение
Space key released
.