如何使控制台应用程序等待";Enter键,但在一段时间后自动继续? [英] How to make a console application wait for the "Enter" key, but automatically continue after time?
本文介绍了如何使控制台应用程序等待";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消息循环。我希望这个程序正好符合您的需要。
这篇关于如何使控制台应用程序等待";Enter键,但在一段时间后自动继续?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文