在 Windows 中使用 PDCurses 时如何处理 SIGINT (Ctrl+C)

How to handling SIGINT (Ctrl+C) while using PDCurses in Windows

我正在使用 PDCurses 在 Windows 中编写控制台应用程序。我希望应用程序在我按下 Ctrl+C.

时终止

我的最小可重现代码如下。如果我注释掉 initscr()endwin(),应用程序将在收到 SIGINT 后终止并在控制台中打印“结束”。不过两条线都不行,玩个不停。

#include <curses.h>
#include <signal.h>

void handle_sig(int sig) {
    if (sig == SIGINT) {
        endwin();
        printf("End\n");
        exit(0);
    }
}

int main() {
    signal(SIGINT, handle_sig);
    initscr();
    while (1);
    return 0;
}

PDCurses 的 Windows 控制台端口似乎从未真正实现 noraw() 模式。 (它在 DOS 和 OS/2 中。)我能够更正这个问题,尽管完整的修复需要更多的工作。

与此同时,如果可能的话,我建议重写您的程序以处理 Ctrl+C 本身。请注意,即使 wincon 的 noraw 模式是固定的,它也可能永远不会在不依赖于控制终端的 PDCurses 端口中工作。

但是如果你想修补你的 PDCurses:

diff --git a/wincon/pdckbd.c b/wincon/pdckbd.c
index d2c3ab69..9bfc8927 100644
--- a/wincon/pdckbd.c
+++ b/wincon/pdckbd.c
@@ -215,7 +215,13 @@ static KPTAB ext_kptab[] =
 
 void PDC_set_keyboard_binary(bool on)
 {
+    DWORD mode;
+
     PDC_LOG(("PDC_set_keyboard_binary() - called\n"));
+
+    GetConsoleMode(pdc_con_in, &mode);
+    SetConsoleMode(pdc_con_in, !on ? (mode | ENABLE_PROCESSED_INPUT) :
+                                    (mode & ~ENABLE_PROCESSED_INPUT));
 }
 
 /* check if a key or mouse event is waiting */
@@ -640,8 +646,8 @@ int PDC_mouse_set(void)
        If turning off the mouse: Set QuickEdit Mode to the status it
        had on startup, and clear all other flags */
 
-    SetConsoleMode(pdc_con_in, SP->_trap_mbe ?
-                   (ENABLE_MOUSE_INPUT|0x0088) : (pdc_quick_edit|0x0088));
+    //SetConsoleMode(pdc_con_in, SP->_trap_mbe ?
+    //               (ENABLE_MOUSE_INPUT|0x0088) : (pdc_quick_edit|0x0088));
 
     memset(&old_mouse_status, 0, sizeof(old_mouse_status));

(这会禁用鼠标输入切换——一个快速而肮脏的补丁。)