首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows中按ctrl-c后如何消除无关的控制台输出?

问在Windows中按ctrl-c后如何消除无关的控制台输出?
EN

Stack Overflow用户
提问于 2019-03-28 22:14:07
回答 1查看 249关注 0票数 2

当按Ctrl-c组合键时,几乎总是会有额外的输出。我希望确保在收到Ctrl-c后,程序不会显示除可能显示的"^C“之外的任何内容。

我发现了大致相同的问题,但这是针对Linux的,我试图将解决方案从Linux“移植”到Windows的尝试没有成功。

在这一点上,我没有东西可以尝试,可以使用一些帮助,我肯定会很感激。谢谢。

下面这个简短的示例程序就遇到了这个问题。

代码语言:javascript
复制
{$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.
EN

回答 1

Stack Overflow用户

发布于 2019-03-28 22:43:43

我通常这样做的方式是有一个单独的单元,并发出信号并进行简单的等待,如下所示。在主控制台项目中,调用WaitForCtrlC而不是Readln()。您还可以使用TEvent并等待事件,而不是循环,如我在此示例中所示:

代码语言:javascript
复制
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}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55399769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档