我有一个delphi控制台应用程序,我需要在用户按任意键时终止,问题是我不知道如何实现一个功能来检测按键何时,我想这样做。< / p>
{$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;
端。
答案 0 :(得分:11)
您可以编写一个函数来检测按键是否被按下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;