在我按下 <enter> 之前,在 stdinput 上读取的控制台应用程序不会 return
Console app read on stdinput do not return until I press <enter>
当我这样做时:
var ch: char;
read(ch);
只有当我按下“回车”时,读取命令才会退出。如何在输入字符后立即读取 return?
你用错了功能。 Read 是标准(旧式 Pascal)函数的一部分,用于从标准输入或文件中读取内容。如您所见,它是基于行的。
解决您在 Windows 下的问题的一种方法,如果使用控制台 API,特别是 ReadConsoleInput,如下所示:
program ReadConsoleInputDemo;
{$APPTYPE CONSOLE}
uses
System.Sysutils, Winapi.Windows;
var
Event : TInputrecord;
EventsRead : DWORD;
Done : Boolean;
begin
WriteLn('Type something, ESC ends program');
Done := False;
repeat
ReadConsoleInput(GetStdhandle(STD_INPUT_HANDLE),
Event, 1, EventsRead);
if Event.Eventtype = key_Event then begin
if Event.Event.KeyEvent.bKeyDown then begin
Done := Event.Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE;
if (not Done) and (Event.Event.KeyEvent.AsciiChar <> #0) then
WriteLn('You typed: ', Event.Event.KeyEvent.AsciiChar);
end;
end;
until Done;
end.
当我这样做时:
var ch: char;
read(ch);
只有当我按下“回车”时,读取命令才会退出。如何在输入字符后立即读取 return?
你用错了功能。 Read 是标准(旧式 Pascal)函数的一部分,用于从标准输入或文件中读取内容。如您所见,它是基于行的。
解决您在 Windows 下的问题的一种方法,如果使用控制台 API,特别是 ReadConsoleInput,如下所示:
program ReadConsoleInputDemo;
{$APPTYPE CONSOLE}
uses
System.Sysutils, Winapi.Windows;
var
Event : TInputrecord;
EventsRead : DWORD;
Done : Boolean;
begin
WriteLn('Type something, ESC ends program');
Done := False;
repeat
ReadConsoleInput(GetStdhandle(STD_INPUT_HANDLE),
Event, 1, EventsRead);
if Event.Eventtype = key_Event then begin
if Event.Event.KeyEvent.bKeyDown then begin
Done := Event.Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE;
if (not Done) and (Event.Event.KeyEvent.AsciiChar <> #0) then
WriteLn('You typed: ', Event.Event.KeyEvent.AsciiChar);
end;
end;
until Done;
end.