当按Ctrl-c组合键时,几乎总是会有额外的输出。我希望确保在收到Ctrl-c后,程序不会显示除可能显示的"^C“之外的任何内容。
我发现了大致相同的问题,但这是针对Linux的,我试图将解决方案从Linux“移植”到Windows的尝试没有成功。
在这一点上,我没有东西可以尝试,可以使用一些帮助,我肯定会很感激。谢谢。
下面这个简短的示例程序就遇到了这个问题。
{$APPTYPE CONSOLE}
program _SetConsoleCtrlHandler;
uses
Windows,
SysUtils
;
function CtrlHandler(CtrlType : DWORD) : BOOL; stdcall;
begin
result := FALSE;
case CtrlType of
CTRL_C_EVENT,
CTRL_BREAK_EVENT:
begin
result := TRUE;
ExitProcess(7);
end;
end;
end;
var
s : shortstring;
begin
SetConsoleCtrlHandler(@CtrlHandler, TRUE);
while TRUE do
begin
write('press <ctrl-c> to end this program : ');
readln(s);
end;
end.发布于 2019-03-28 22:43:43
我通常这样做的方式是有一个单独的单元,并发出信号并进行简单的等待,如下所示。在主控制台项目中,调用WaitForCtrlC而不是Readln()。您还可以使用TEvent并等待事件,而不是循环,如我在此示例中所示:
uses
{$IFDEF LINUX}
Posix.Signal,
{$ENDIF}
{$IFDEF MSWINDOWS}
Windows,
{$ENDIF}
SysUtils;
procedure WaitForCtrlC;
implementation
var
Control_C: Boolean = False;
{$IFDEF MSWINDOWS}
function ConsoleCtrlHandler(dwCtrlType: DWORD): BOOL; stdcall;
begin
if (dwCtrlType = CTRL_C_EVENT) then
Control_C := True;
Result := True;
end;
{$ENDIF}
{$IFDEF LINUX}
var
sigIntHandler: sigaction_t;
procedure SigHandler(SigNum: Integer); cdecl;
begin
Control_C := True;
end;
{$ENDIF}
procedure WaitForCtrlC;
begin
while not Control_C do
Sleep(25);
end;
initialization
{$IFDEF MSWINDOWS}
Windows.SetConsoleCtrlHandler(@ConsoleCtrlHandler, True);
{$ENDIF}
{$IFDEF LINUX}
sigIntHandler._u.sa_handler := @SigHandler;
sigemptyset(sigIntHandler.sa_mask);
sigIntHandler.sa_flags := 0;
sigaction(SIGINT, @sigIntHandler, nil);
{$ENDIF}https://stackoverflow.com/questions/55399769
复制相似问题