Tôi đã làm điều tương tự như sau một vài lần trước đây:
đầu tiên khai báo một vài biến toàn cầu:
var
hIn: THandle;
hTimer: THandle;
threadID: cardinal;
TimeoutAt: TDateTime;
WaitingForReturn: boolean = false;
TimerThreadTerminated: boolean = false;
Thứ hai, thêm chức năng
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;
Bây giờ bạn có thể sử dụng TimeoutWait
đợi cho Return, nhưng không dài hơn số giây đã cho. Nhưng bạn phải thiết lập hIn
và gọi StartTimerThread
trước khi bạn sử dụng chức năng này:
begin
hIn := GetStdHandle(STD_INPUT_HANDLE);
StartTimerThread;
Writeln('A');
TimeoutWait(5);
Writeln('B');
TimeoutWait(5);
Writeln('C');
TimeoutWait(5);
EndTimerThread;
end.
Bạn có thể thoát khỏi StartTimerThread
, đặc biệt là nếu bạn bắt đầu một thread cho mỗi cuộc gọi, nhưng nó có thể là khó khăn hơn để gọi TimeoutWait
nhiều lần trong một hàng rồi.
Nguồn
2013-04-15 19:42:29
'Readln' dòng chảy khối thực hiện cho đến khi người dùng nhấn RETURN. – OnTheFly
Vâng vâng, đó là mấu chốt của câu hỏi không phải là nó –
Nếu bạn muốn được trợ giúp về mã của mình, hãy đăng ** mã thực **. Đăng nội dung nào đó không có ý nghĩa đối với câu hỏi của bạn sẽ không hữu ích. (Không có "nút" trong ứng dụng giao diện điều khiển, vì vậy tôi đoán bạn có nghĩa là phím '5'.' ReadLn' đợi cho đến khi 'Enter' được nhấn, vì vậy nó sẽ không hoạt động với phím '5' trừ khi bạn bấm '5' và sau đó là 'Enter'. Nhưng nó không rõ ràng những gì bạn đang thực sự yêu cầu ở đây, và mã của bạn không giúp." Hiển thị tin nhắn trên nút 5 "và" Nhấn ENTER để tiếp tục "dường như không khớp Hãy [sửa] câu hỏi của bạn để làm cho nó rõ ràng hơn về những gì bạn đang yêu cầu chúng tôi –