为了账号安全,请及时绑定邮箱和手机立即绑定

命令提示符中的QuickEdit模式如何以及为什么冻结应用程序?

/ 猿问

命令提示符中的QuickEdit模式如何以及为什么冻结应用程序?

不负相思意 2019-10-19 17:04:38

我最近在Windows上遇到了一个命令提示符问题,该命令提示符启用了QuickEdit模式,单击该窗口选择文本并挂起正在运行的程序。显然,这是已知的行为-我发现了一些与此有关的问题:


命令行Windows挂在RDP Windows中

Windows控制台应用程序陷入困境

如何为单个脚本禁用快速编辑模式

应用程序如何“暂停” /“暂停”?该过程类似于SIGSTOP* nix上的信号吗?(我也很想了解为什么首先要存在此功能?这似乎不直观且危险。)


查看完整描述

2 回答

?
梵蒂冈之花

这很大程度上是设计使然。当您的程序不断滚动控制台窗口的内容时,用户没有合理的方式选择文本。因此,控制台主机程序仅停止读取您的stdout / stderr输出,并且程序挂起,直到用户完成操作为止。可以更改此设置,您必须调用Get + SetConsoleMode()并关闭ENABLE_QUICK_EDIT_MODE选项。


请注意,此“挂起”与程序生成stdout输出的速度远高于控制台主机可以消耗它的输出时的执行暂停没有根本不同。尽管这些延迟是有限的。


这不是用户停止程序的唯一方法,他也可以直接按Ctrl + S。再次按Ctrl + Q。如果您足够大,则可以将这些控制代码识别为Xon / Xoff,即终端机的握手字符。这实际上是一个控制台,它是对终端的简单仿真,就像其在1970年代的用法一样。这也可以更改,您必须停止依赖内置的缓冲控制台输入,并切换到ReadConsole()。或者通过关闭ENABLE_LINE_INPUT控制台选项,不确定由于没有提到任何语言运行时而产生的副作用,因此必须尝试一下。


当然终止程序非常容易。当用户键入Ctrl + Z时,您将在stdin上获得EOF,这应该结束您的程序。无论您的程序在做什么,都有Ctrl + C和Ctrl + Break可以立即终止。您可以使用SetConsoleCtrlHandler()获得有关这些的通知,但不能阻止它。


如果默认行为具有危险性并冒着危害人类健康的危险,那么我强烈建议您雇用一名顾问。而且不知道是谁写了这个答案。


查看完整回答
反对 回复 2019-10-19
?
幕布斯7119047

为了回答我最近是如何在python脚本中调试相同问题并使用windbg捕获堆栈跟踪的。



//img1.mukewang.com/5daad1c50001824523741475.jpg


最终,对WriteConsole的调用将导致NtDeviceIoControlFile系统调用,并且只有在发生按键或更改QuickEdit模式后内核才会返回。因此,如果您从不写入控制台,则可以避免冻结QuickEdit模式。您的用户将永远不需要复制任何内容。那么,再次等待什么是QuickEdit模式?


查看完整回答
反对 回复 2019-10-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信