我有一个用Python编写的控制台应用程序。 Windows 10控制台的“标记”模式令我感到沮丧,因为用户在执行像切换窗口这样简单的操作时不小心点击了应用程序。我有办法控制并阻止它吗?
对于那些不知道标记模式的人,当用户在控制台窗口中选择一些文本时。当程序接下来写入stdout时,整个程序暂停,这非常非常烦人。
谢谢!
答案 0 :(得分:4)
在Windows 10中使用鼠标自动“标记”模式,是以前版本的“快速编辑”模式。我相信唯一的区别是它现在默认开启。可以从代码中启用/禁用快速编辑模式:
import time
import win32console
ENABLE_QUICK_EDIT_MODE = 0x40
ENABLE_EXTENDED_FLAGS = 0x80
def quick_edit_mode(turn_on=None):
""" Enable/Disable windows console Quick Edit Mode """
screen_buffer = win32console.GetStdHandle(-10)
orig_mode = screen_buffer.GetConsoleMode()
is_on = (orig_mode & ENABLE_QUICK_EDIT_MODE)
if is_on != turn_on and turn_on is not None:
if turn_on:
new_mode = orig_mode | ENABLE_QUICK_EDIT_MODE
else:
new_mode = orig_mode & ~ENABLE_QUICK_EDIT_MODE
screen_buffer.SetConsoleMode(new_mode | ENABLE_EXTENDED_FLAGS)
return is_on if turn_on is None else turn_on
quick_edit_enabled = quick_edit_mode()
while True:
print('Quick edit is %s' % ('on' if quick_edit_enabled else 'off'))
time.sleep(3)
quick_edit_enabled = quick_edit_mode(not quick_edit_enabled)
答案 1 :(得分:0)
我对斯蒂芬的答案发表评论时名声稍差,所以我将发布一个单独的答案。
要使这种多平台/环境友好型功能,请添加一些条件检查,以在不运行在Windows上或没有控制台连接到进程时(例如在IDE中运行或通过pyinstaller构建时)跳过代码: / p>
if os.name == "nt" and sys.stdout.isatty():
# stephen's code here...
这可以防止在某些情况下引发错误。在我看来,您还应该在代码块周围添加一个try / catch-all,因为所涉及方法的os实现是 unknown 和 known ,以引发异常和挑剔。在最坏的情况下,我宁愿我的代码继续在启用QuickEdit的情况下运行,而不是因为它而失败。