如何更改Windows控制台窗口上X按钮的功能?

时间:2015-06-06 01:48:13

标签: python windows

我在Python中有一个常规控制台窗口(Windows 8.1),我想更改close / X按钮的功能。当游戏结束时,它需要做一些清理和类似的事情,那么我该如何覆盖它的作用呢?

1 个答案:

答案 0 :(得分:3)

您可以使用SetConsoleCtrlHandler来拦截控制台关闭事件,以指定为Ctrl-C,Ctrl-Break,控制台退出和系统关闭事件调用的函数。对于控制台退出事件,您无法阻止控制台被销毁,但您可以拦截事件并运行一些代码。例如:

import sys
import time
import win32api

forever = True
handled_ctrl_type = None

def handler(ctrl_type):
    global forever, handled_ctrl_type
    forever = False
    handled_ctrl_type = ctrl_type
    print("HANDLER")
    return True

def main(args = None):
    win32api.SetConsoleCtrlHandler(handler, True)
    n = 0
    while forever:
        time.sleep(1)
        print(n)
        n = n + 1
    print("exiting...", handled_ctrl_type)
    return 0

if __name__ == '__main__':
    sys.exit(main())

如果在控制台中运行(使用Python 3)并按Ctrl-C,则应该得到如下内容:

c:\src>python python\setconsolectrl.py
0
HANDLER
1
exiting... 0

其中0是CTRL_C_EVENT的值。对于控制台退出,我们应该在这里设置2,所以我们可以知道生成了什么类型的事件。

如果你运行它并点击大红色X关闭控制台,你可以看到HANDLER被打印,因为控制台被破坏了。您应该在文件中添加一些日志记录,以确保所有清理工作都被调用,但这看起来应该可以解决您的问题。