Delphi 版的 KeyPressed 函数

有时候,我们需要在 console 中检查是否有按键按下,对于c语言来说,有 kbhit 和 keypressed, 但是Delphi库中没有对应的现成函数。

经过搜索,最终找到了一段代码【参考1】,根据这段代码,编写下面的测试程序:

program Project5;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,Windows;


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;

var
  i:integer;

  begin
  while (keypressed()=false) do
    begin
      write('waiting ');
      writeln(i);
      sleep(1000);
      inc(i);
    end;
end.

 

运行结果:

dkp

参考:
1.https://stackoverflow.com/questions/5845080/how-i-can-implement-a-iskeypressed-function-in-a-delphi-console-application

发表评论

电子邮件地址不会被公开。 必填项已用*标注