在 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));
(这会禁用鼠标输入切换——一个快速而肮脏的补丁。)
我正在使用 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));
(这会禁用鼠标输入切换——一个快速而肮脏的补丁。)