Python3 --类似于在PowerShell中工作的win32api.SetConsoleCtrlHandler()的函数

gmxoilav  于 2023-01-22  发布在  Python
关注(0)|答案(1)|浏览(153)

Win32 API命令似乎不适用于PowerShell(我运行的是7,但我认为这不重要),只适用于劣质的IMHO命令提示符。
我正在建立一个程序(一个美化HOSTS网站拦截器),运行在简单的结构“查询命令,执行命令;重复直到用户提示退出”,并且用户可以查询程序的一个东西是UNBLOCK category>site_nickname FOR minutes。这在一个线程中运行程序,在另一个线程中启动计时器,以便用户可以继续按照他们的期望使用程序。在计时器之后,取消程序开始时运行的UNBLOCK命令,以便用户可以返回工作。我想避免的是用户能够通过说UNBLOCK来欺骗命运,然后通过“关闭”按钮关闭程序,终止PowerShell示例、我的Python程序及其所有线程,从而确保UNBLOCK命令永远不会被伙伴BLOCK命令撤消。
用户可以通过键入EXIT或CANCEL退出程序。这会使程序结束,然后运行sys.exit()。正如我所发现的,使用atexit库基本上就是这样做的,但之后会运行您想要的函数,不会拦截关闭按钮的点击。设置控制台控制处理程序似乎只能在命令提示符下工作(它对ANSI转义/emojis/Unicode的支持可能也是参差不齐的),还有window_exit()函数,或者我猜合适的术语是“方法”--

def window_exit(signal_type):
    sure = ask_input("Wait, wait! Are you sure you want to exit?") # input plus ANSI escape sequence, highlights the input prompt in blue and adds ">>" on a new line
    if sure == "Yes":
        evaluate("EXIT") # runs this command as if the user typed it in to be evaluated by my program

--不能正确地接受输入。相反,它显示消息,然后出于某种原因决定我试图拉一些"Press any key to continue ..."类型的东西,当我希望用户能够键入任何内容,然后让它进行计算。
我能做些什么来使任何试图“欺骗”和提前退出程序的行为得到承认和处理呢?

gfttwv5a

gfttwv5a1#

在Python中,没有与PowerShell中的win32api.SetConsoleCtrlHandler()函数直接等价的函数,但是,可以使用信号模块实现类似的功能。
信号模块允许您注册一个函数,以便在程序接收到特定信号时调用。在Windows中,当用户按CTRL + C键时,将发送CTRL_C_EVENT信号。您可以使用signal.signal()函数注册一个函数来处理此信号。
下面是一个如何在Python中注册一个函数来处理CTRL_C_EVENT信号的例子:

import signal

def handle_ctrl_c(signum, frame):
    print("CTRL+C pressed")

signal.signal(signal.SIGINT, handle_ctrl_c)

在这个例子中,handle_ctrl_c函数将在CTRL + C键被按下时被调用,signum参数是接收到的信号编号,frame参数是当前堆栈帧。

相关问题