如何在WindowsXP的Python控制台程序中禁用Control-C?
我想把我的cmd.com窗口设置成一种模式,这样按下Control-C就不会给Python(如果有关系的话,是ActiveState)发送SIGINT信号。
我知道可以用signal模块来处理SIGINT信号,但问题是处理SIGINT的时机太晚了;等我处理的时候,系统调用已经被打断了。
我想要一种类似于*nix系统的“原始”模式。也就是说,让输入先排队,等我的应用程序安全的时候再去读取它。
令人抓狂的是,msvcrt.getch()似乎会把Control-C当作一个字符返回。但这只在程序被getch()阻塞的时候有效。如果我在另一个系统调用中(比如说sleep,只是举个例子),我就会收到SIGINT信号。
1 个回答
4
你需要调用一个叫做 SetConsoleCtrlHandler 的函数。这个函数的第一个参数要传入 NULL(也就是 0),第二个参数要传入 TRUE(也就是 1)。如果你已经在使用 pywin32 这个库,那么可以直接用 win32.SetConsoleCtrlHandler 来完成这个操作。如果没有使用这个库,ctypes 也可以用,具体的调用方式是 ctypes.windll.kernel32.SetConsoleCtrlHandler(0, 1)
。