Ctrl+C 和 Ctrl+Break 信号

Ctrl+CCtrl+Break 键组合通过控制台进程接收特殊处理。 默认情况下,当控制台窗口具有键盘焦点时,Ctrl+CCtrl+Break 被视为信号(SIGINT 或 SIGBREAK),而不是视为键盘输入。 默认情况下,这些信号会传递到与控制台连接的所有控制台进程。 (分离的进程不受影响。请参阅创建控制台)系统在每个客户端进程中创建一个新线程来处理事件。 如果正在调试该进程,则该线程会引发一个异常。 调试器可处理该异常,或继续处理未处理的异常。

Ctrl+Break 始终被视为信号,但应用程序可通过阻止调用处理程序函数的两种方式,来更改默认 Ctrl+C 行为:

  • SetConsoleMode 函数可为控制台的输入缓冲区禁用 ENABLE_PROCESSED_INPUT 输入模式,因此会将 Ctrl+C 报告为键盘输入而不是信号
  • 如果 SetConsoleCtrlHandler 是以 Null 和 True 值作为其参数调用的,则调用进程将忽略 Ctrl+C 信号。 正常的 Ctrl+C 处理可通过使用 Null 和 False 值调用 SetConsoleCtrlHandler 进行还原。 此属性(忽略或不忽略 Ctrl+C 信号)由子进程继承,但只要不影响现有进程,任何进程都可启用或禁用此属性。

有关如何处理这些信号(包括超时)的详细信息,请参阅处理程序例程回调文档