Windows控制台降级:程序突然无法处理ctrl-c


0

有一段时间我运行的控制台程序无法处理ctrl-c。示例是cygwin程序,如果我在控制台而不是mintty命令行音频工具中运行它们sox.exe

我一般型Win-RcmdEnter然后启动一个程序。

通常,当您bash在Windows控制台中运行Cygwin shell并按ctrl-c时,它会处理它并重新打印它的提示,但现在它已终止并且我被提示Terminate batch job (Y/N)?

通常,sox.exe响应ctrl-c打印“中止”消息,但现在它崩溃并sox.exe has stopped working显示标准GUI弹出窗口。

此外,如果我从.bat文件中启动一些程序,我还会得到另一个弹出窗口:windows command processor has stopped working

重新启动后,它再次运行。注销/登录或切换用户不起作用。

以下简单程序也在我的机器上崩溃,但同一个二进制文件在另一个上成功:

#include "stdafx.h"

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <conio.h>

static BOOL WINAPI MyHandlerRoutine(
    _In_ DWORD dwCtrlType
) {
    switch (dwCtrlType) {
    case CTRL_C_EVENT:
        printf("ctrl-c pressed\n");
        return TRUE;
    case CTRL_BREAK_EVENT:
        printf("ctrl-break pressed\n");
        return TRUE;
    }
    return FALSE;
}

int main()
{
    int c;
    DWORD dw = 0;
    BOOL b;

    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);

    b = GetConsoleMode(hStdin, &dw);
    printf("GetConsoleMode() returned %d %u\n", (int)b, dw);

    dw = dw & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);

    dw = ENABLE_PROCESSED_INPUT;

    SetLastError(0);

    b = SetConsoleMode(hStdin, dw);
    printf("SetConsoleMode(%u) returned %d\n", dw, (int)b);

    if (!b) {
        printf("GetLastError() returned %u\n", GetLastError());
    }

    b = SetConsoleCtrlHandler(MyHandlerRoutine, TRUE);
    printf("SetConsoleCtrlHandler() returned %d\n", (int)b);

    printf("press ENTER to exit\n");
    for (;;) {
        char buf[1];
        c = getchar();
        printf("%02x ", c);
        // EOF == c || 
        if (10 == c || 13 == c) break;
    }
    return 0;
}

你是如何开始你的控制台程序的?您是从快捷方式还是从批处理文件启动它们,还是打开命令提示符然后手动启动可执行文件?
Twisty Impersonator

我通常键入Win-R,cmd,Enter然后启动一个程序。
盆地

好。请将你的回答编辑成你的问题
Twisty Impersonator
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.