Как я могу реализовать функцию IsKeyPressed в консольном приложении delphi?

#delphi

#delphi

Вопрос:

У меня есть консольное приложение delphi, которое мне нужно завершить, когда пользователь нажимает любую клавишу, проблема в том, что я не знаю, как реализовать функцию для определения нажатия клавиши, я хочу сделать что-то вроде этого.

 {$APPTYPE CONSOLE}

begin
 MyTask:=MyTask.Create;
 try
 MyTask.RunIt; 
  while MyTask.Running and not IsKeyPressed do //how i can implement a IsKeyPressed  function?
    MyTask.SendSignal($56100AA);
 finally
   MyTask.Stop;
   MyTask.Free;
 end;
  

завершение.

Комментарии:

1. вы уверены, что хотите цикл занятости? Почему бы не прервать нажатие ctrl break?

Ответ №1:

Вы можете написать функцию для определения, была ли нажата клавиша, проверяя console input buffer .

Каждая консоль имеет входной буфер, который содержит очередь записей входных событий. Когда окно консоли находится в фокусе клавиатуры, консоль форматирует каждое событие ввода (например, одно нажатие клавиши, движение мыши или щелчок кнопкой мыши) как запись ввода, которую она помещает во входной буфер консоли.

Сначала вы должны вызвать функцию GetNumberOfConsoleInputEvents, чтобы получить количество событий, затем извлечь событие с помощью функции PeekConsoleInput и проверить, является ли событие KEY_EVENT , наконец, очистить буфер ввода консоли с помощью FlushConsoleInputBuffer.

Проверьте этот пример

 function KeyPressed:Boolean;
var
  lpNumberOfEvents     : DWORD;
  lpBuffer             : TInputRecord;
  lpNumberOfEventsRead : DWORD;
  nStdHandle           : THandle;
begin
  Result:=false;
  //get the console handle
  nStdHandle := GetStdHandle(STD_INPUT_HANDLE);
  lpNumberOfEvents:=0;
  //get the number of events
  GetNumberOfConsoleInputEvents(nStdHandle,lpNumberOfEvents);
  if lpNumberOfEvents<> 0 then
  begin
    //retrieve the event
    PeekConsoleInput(nStdHandle,lpBuffer,1,lpNumberOfEventsRead);
    if lpNumberOfEventsRead <> 0 then
    begin
      if lpBuffer.EventType = KEY_EVENT then //is a Keyboard event?
      begin
        if lpBuffer.Event.KeyEvent.bKeyDown then //the key was pressed?
          Result:=true
        else
          FlushConsoleInputBuffer(nStdHandle); //flush the buffer
      end
      else
      FlushConsoleInputBuffer(nStdHandle);//flush the buffer
    end;
  end;
end;