#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;