Отслеживание событий клавиш в 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.

Объяснение кода листинга программы

  1. Объявлены используемые модули и функция: uses crt; function GetKeyState(nVirtKey: integer): smallint; external 'User32.dll';
  2. Объявлена процедура StopWhileSpacePressed с переменной pressed типа word и переменной nVirtKey типа integer.
  3. В основной программе объявлена переменная i типа integer с диапазоном от 1 до 20.
  4. В цикле от 1 до 20 выводится значение переменной i.
  5. Проверяется, нажата ли клавиша пробела (ReadKey = #32), и если да, то вызывается процедура StopWhileSpacePressed.
  6. Программа спит в течение 500 миллисекунд (sleep(500)).
  7. После завершения цикла выводится сообщение Space key released.

Оцени полезность:

7   голосов , оценка 3.429 из 5
Похожие ответы