我使用过多个 Windows7-64 系统。除了一个系统外,在运行 .cmd 文件的 CMD 窗口中输入 ^C 总是(并且是预料之中的)会停止程序。更重要的是,如果 .cmd 脚本启动了计算量很大的 Win32 应用程序(称为 HIGHCPU),则 HIGHCPU 应用程序显然会听到 ^C 并退出,从而导致 .cmd 脚本退出。
一台特殊的机器表现得好像 HIGHCPU 应用程序从未听到过 ^C。该应用程序只是继续运行。如果它完成,或者我终止其进程,.cmd 脚本会突然注意到 ^C 并询问是否应停止该脚本。
在所有机器上,^C 在其他情况下的作用类似于复制选定的文本,正如您所期望的那样。
我已经验证,如果我直接从命令行启动 HIGHCPU 应用程序,^C 会立即导致其停止运行并退出。暗角:HIGHCPU 是一个非常复杂的汇编应用程序;此外,它使用标准 Win32 SEH 捕获 ^C 异常,并且该捕获机制会导致它以非零状态退出。
我感觉我已经在一台机器上以某种方式配置了 Win7,以某种方式将 ControlC 特殊地用于 CMD 窗口。
答案1
看来我的 HIGHCPU 程序没有明确“启用 ^C 处理”。我添加了以下行:
SetConsoleCtrlHandler(NULL,FALSE); // enable ^C processing by our handler
在 HIGHCPU 源程序中已经存在的行之前:
if(!SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) ) ...
这似乎已经解决了问题。
此 MS 页面解释了第一个调用的作用: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686016%28v=vs.85%29.aspx
我对此有点惊讶;自 1997 年以来,在运行 HIGHCPU 的每个 Windows 系统上(Windows/NT),^C 行为都是“符合预期”的。这是我第一次必须做些什么来启用它。文档没有明确说明默认行为(“处理 ^C/忽略 ^C”);我有点期待在 Windows 7 中有人忘记初始化此位的状态,或者更改了它的初始化方式。
尽管如此,这似乎在“有趣的” Windows7 机器上有效。几天后我会发现它是否会破坏其他地方的行为。