【问题标题】:issue with python about win32api.SetConsoleCtrlHandler [closed]关于win32api.SetConsoleCtrlHandler的python问题[关闭]
【发布时间】:2020-06-22 18:42:17
【问题描述】:

今天我使用 win32api.SetConsoleCtrlHandler 捕捉控制台窗口的关闭按钮。

代码如下:

import os
import sys
import win32api

if __name__ == "__main__":
    def callback(sig):
        print("Exit handler called!")
        exit_fun()
        sys.exit(0)

    def exit_fun():
        input("Press any key to exit!")

    win32api.SetConsoleCtrlHandler(callback, True)

    print("Press to quit")
    try:
        input()
    except (EOFError):
        while 1:
            pass

我有一个关于exit_fun功能的问题,当我使用ctrl c关闭cmd窗口时,它可以工作!

但是!我尝试使用控制台窗口的关闭按钮。 exit_fun 不起作用。

我不知道为什么...

感谢您的回答:)

【问题讨论】:

  • 关闭控制台窗口会终止控制台进程。它不会追溯注入控制序列。尽管从问题中不清楚,但您需要解决什么问题。 “它不起作用” 根本不是问题陈述。 How to Ask 解释如何做得更好。

标签: python winapi cmd


【解决方案1】:

但是!我尝试使用控制台窗口的关闭按钮。 exit_fun 是 不工作。

我假设您在谈论为什么 exit_fun 不能再读取控制台输入。

当你点击控制台窗口的关闭按钮时,系统会产生CTRL_CLOSE_EVENT信号。 控制台函数,或任何调用控制台函数的 C 运行时函数,在处理前面提到的此信号期间可能无法可靠地工作。 原因是部分或全部内部控制台清理例程可能在执行进程信号处理程序之前已被调用。

单击关闭按钮后会有超时(5000 毫秒)。即使您什么都不做,当超时发生时控制台进程也会退出。但是,使用 ctrl c 时没有超时。

请参阅SetConsoleCtrlHandler function 和HandlerRoutine callback function。

【讨论】:

  • 原创!谢谢您的回答!
  • 你好丽塔。如果控制台应用程序在执行过程中中断/关闭,我正在尝试使用 win32api.SetConsoleCtrlHandler 关闭 Excel 实例。该函数确实被调用,但是当我尝试关闭时出现错误,这通常不会在它之外发生,可能是因为它是一个不同的线程,但我不确定。如果您能帮助我,我将不胜感激。 Link to my question。感谢您的宝贵时间。
猜你喜欢
  • 2015-07-08
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2011-10-17
  • 2013-05-13
  • 2015-01-13
相关资源
最近更新 更多