从我的应用程序关闭 Windows 10 控制台 "Mark" 模式

Turn off Windows 10 console "Mark" mode from my application

我有一个用 Python 编写的控制台应用程序。 Windows 10 控制台的 "Mark" 模式让我很沮丧,因为用户在做一些像切换 windows 这样简单的事情时不小心点击了应用程序。我有什么办法可以控制和阻止它吗?

对于那些不知道标记模式的人来说,就是用户在控制台中选择一些文本时 window。当程序接下来写入 stdout 时,整个程序暂停,这非常非常烦人。

谢谢!

在windows 10 中使用鼠标的自动"Mark" 模式,是先前版本的"Quick Edit" 模式。我相信唯一的区别是它现在默认打开。快速编辑模式可以是 enabled/disabled 来自代码:

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)

我对 Stephen 的回答发表评论的声誉有点欠缺,所以我要os单独回答。

为了使这个 multi-platform/environment 友好,添加一些条件检查以在 windows 上没有 运行ning 或没有控制台连接到进程时跳过代码,例如 运行在 IDE 中或通过 pyinstaller 等构建时:

if os.name == "nt" and sys.stdout.isatty():
    # stephen's code here...

这可以防止在某些情况下出现错误。在我看来,您还应该在代码块周围添加一个 try/catch-all,因为 os-所涉及方法的实现 unknown 并且 known 提出异常并挑剔。在最坏的情况下,我宁愿我的代码在启用 QuickEdit 的情况下继续 运行 而不是因此而失败。