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 ..."
类型的东西,当我希望用户能够键入任何内容,然后让它进行计算。
我能做些什么来使任何试图“欺骗”和提前退出程序的行为得到承认和处理呢?
1条答案
按热度按时间gfttwv5a1#
在Python中,没有与PowerShell中的win32api.SetConsoleCtrlHandler()函数直接等价的函数,但是,可以使用信号模块实现类似的功能。
信号模块允许您注册一个函数,以便在程序接收到特定信号时调用。在Windows中,当用户按CTRL + C键时,将发送CTRL_C_EVENT信号。您可以使用signal.signal()函数注册一个函数来处理此信号。
下面是一个如何在Python中注册一个函数来处理CTRL_C_EVENT信号的例子:
在这个例子中,handle_ctrl_c函数将在CTRL + C键被按下时被调用,signum参数是接收到的信号编号,frame参数是当前堆栈帧。