【问题标题】:How to disable Control-C in a WindowsXP Python console program?如何在 WindowsXP Python 控制台程序中禁用 Control-C?
【发布时间】:2009-08-07 05:35:40
【问题描述】:

我想将我的 cmd.com 窗口置于 Control-C 不会向 Python 生成 SIGINT 信号的模式(如果重要,则为 ActiveState)。

我知道我可以使用信号模块来处理 SIGINT。问题是处理 SIGINT 为时已晚;到它被处理的时候,它已经中断了一个系统调用。

我想要与 *nix“原始”模式等效的东西。只要让输入排队,当我的应用程序可以安全地读取它时,它就会。

令人发指的是,msvcrt.getch() 似乎将 Control-C 作为字符返回。但这仅在程序被 getch() 本身阻止时才有效。如果我在另一个系统调用中(睡眠,只是举个例子),我会得到 SIGINT。

【问题讨论】:

    标签: python windows-xp console-application copy-paste control-c


    【解决方案1】:

    您需要调用win32 API 函数SetConsoleCtrlHandler,第一个参数为NULL (0),第二个参数为TRUE (1)。如果你已经在使用 pywin32,win32.SetConsoleCtrlHandler 就可以了,否则 ctypes 应该可以工作,特别是通过ctypes.windll.kernel32.SetConsoleCtrlHandler(0, 1)/

    【讨论】:

    • 谢谢!这似乎有效(防止睡眠被打断)。奇怪的是,它会导致交互式提示退出并将我转储到 cmd.com 窗口。这对我的应用程序来说不是问题,只是好奇。
    • 我应该说我之前评论中的行为是使用 ctypes,而不是 pywin32,如果这很重要的话(哦,我又回到了使用 Python24 的石器​​时代 :))。
    • @dgou,总是乐于助人(如果一个答案确实有助于解决您的问题,请记住接受它:这是堆栈溢出礼仪!-)。
    • 是的,非常接近。有趣的是,当 Ctrl-C 处理被禁用时,按键事件被完全吞没了。我的主要目标是防止中断。获得字符会更好: ctypes.windll.kernel32.SetConsoleCtrlHandler(0, 1) time.sleep(10) # 在此期间我键入 ^C msvcrt.get() # 挂起等待字符。 # 如果我输入 A 而不是 ^C 则 getch() 返回它而不挂起。同样,没什么大不了的,只是这个和交互式提示行为是好奇心。 :) 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多