我在Python中有一个常规控制台窗口(Windows 8.1),我想更改close / X按钮的功能。当游戏结束时,它需要做一些清理和类似的事情,那么我该如何覆盖它的作用呢?
答案 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被打印,因为控制台被破坏了。您应该在文件中添加一些日志记录,以确保所有清理工作都被调用,但这看起来应该可以解决您的问题。