delphi 命令行程序延时显示或相应回车键显示  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 命令行程序延时显示或相应回车键显示


program Project1;


{$APPTYPE CONSOLE}


{$R *.res}


uses

 Winapi.Windows, System.SysUtils,DateUtils;


  var

  hIn: THandle;

  hTimer: THandle;

  threadID: cardinal;

  TimeoutAt: TDateTime;

  WaitingForReturn: boolean = false;

  TimerThreadTerminated: boolean = false;


function TimerThread(Parameter: pointer): integer;

var

  IR: TInputRecord;

  amt: cardinal;

begin

  result := 0;

  IR.EventType := KEY_EVENT;

  IR.Event.KeyEvent.bKeyDown := true;

  IR.Event.KeyEvent.wVirtualKeyCode := VK_RETURN;

  while not TimerThreadTerminated do

  begin

    if WaitingForReturn and (Now >= TimeoutAt) then

      WriteConsoleInput(hIn, IR, 1, amt);

    sleep(500);

  end;

end;


procedure StartTimerThread;

begin

  hTimer := BeginThread(nil, 0, TimerThread, nil, 0, threadID);

end;


procedure EndTimerThread;

begin

  TimerThreadTerminated := true;

  WaitForSingleObject(hTimer, 1000);

  CloseHandle(hTimer);

end;


procedure TimeoutWait(const Time: cardinal);

var

  IR: TInputRecord;

  nEvents: cardinal;

begin


  TimeOutAt := IncSecond(Now, Time);

  WaitingForReturn := true;


  while ReadConsoleInput(hIn, IR, 1, nEvents) do

    if (IR.EventType = KEY_EVENT) and

      (TKeyEventRecord(IR.Event).wVirtualKeyCode = VK_RETURN)

      and (TKeyEventRecord(IR.Event).bKeyDown) then

      begin

        WaitingForReturn := false;

        break;

      end;


end;



begin

  try


  hIn := GetStdHandle(STD_INPUT_HANDLE);

  StartTimerThread;


  Writeln('A');

  TimeoutWait(5);


  Writeln('B');

  TimeoutWait(5);


  Writeln('C');

  TimeoutWait(5);


  EndTimerThread;


    { TODO -oUser -cConsole Main : Insert code here }

  except

    on E: Exception do

      Writeln(E.ClassName, ': ', E.Message);

  end;

end.



推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.040881156921387 seconds