如何使控制台应用程序等待"Enter键,但在一段时间后自动继续? [英] How to make a console application wait for the "Enter" key, but automatically continue after time?

查看:30
本文介绍了如何使控制台应用程序等待"Enter键,但在一段时间后自动继续?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Delphi 7中创建了一个控制台应用程序,它应该在您按Enter按钮后显示消息:

begin
  writeln ('Press ENTER to continue');
  readln;
  writeln ('blablabla');
  writeln ('blablabla');
end;

问题是用户可以按任何按钮继续,这就是问题所在。如果用户按下键盘上的Enter按钮,我只想让程序继续。除非我需要它在一段时间(如5秒)后自动继续,而不需要用户输入。

如何使控制台应用程序等待用户按Enter键一段时间,但在用户不按Enter键时自动继续?

推荐答案

您可以尝试此代码(改编自SynCommons.pas单元,在mORMot框架中):

procedure ConsoleWaitForEnterKey(TimeOut: integer);
  function KeyPressed(ExpectedKey: Word):Boolean;
  var lpNumberOfEvents: DWORD;
      lpBuffer: TInputRecord;
      lpNumberOfEventsRead : DWORD;
      nStdHandle: THandle;
  begin
    result := false;
    nStdHandle := GetStdHandle(STD_INPUT_HANDLE);
    lpNumberOfEvents := 0;
    GetNumberOfConsoleInputEvents(nStdHandle,lpNumberOfEvents);
    if lpNumberOfEvents<>0 then begin
      PeekConsoleInput(nStdHandle,lpBuffer,1,lpNumberOfEventsRead);
      if lpNumberOfEventsRead<>0 then
        if lpBuffer.EventType=KEY_EVENT then
          if lpBuffer.Event.KeyEvent.bKeyDown and
             ((ExpectedKey=0) or (lpBuffer.Event.KeyEvent.wVirtualKeyCode=ExpectedKey)) then
            result := true else
            FlushConsoleInputBuffer(nStdHandle) else
          FlushConsoleInputBuffer(nStdHandle);
    end;
  end;
    var Stop: cardinal;
begin
  Stop := GetTickCount+TimeOut*1000;
  while (not KeyPressed(VK_RETURN)) and (GetTickCount<Stop) do 
    Sleep(50); // check every 50 ms
end;

请注意,mORMot中嵌入的版本确实允许调用TThread.Synchronize()方法并在必要时处理GDI消息循环。我希望这个程序正好符合您的需要。

这篇关于如何使控制台应用程序等待&quot;Enter键,但在一段时间后自动继续?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆