繁体   English   中英

从我的应用程序中关闭 Windows 10 控制台“标记”模式

[英]Turn off Windows 10 console "Mark" mode from my application

我有一个用 Python 编写的控制台应用程序。 Windows 10 控制台的“标记”模式让我非常沮丧,因为用户在执行诸如切换窗口之类的简单操作时不小心点击了应用程序。 我有什么办法来控制和阻止这种情况吗?

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

在 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)

我对斯蒂芬的答案发表评论的声誉有点不足,所以我发布了一个单独的答案。

为了使这种多平台/环境友好,添加一些条件检查以在未在 Windows 上运行或没有控制台连接到进程时(例如在 IDE 中运行或通过 pyinstaller 构建时等)跳过代码:

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

这可以防止在几种情况下引发错误。 在我看来,您还应该在代码块周围添加一个 try/catch-all,因为所涉及方法的操作系统实现是未知的,并且已知会引发异常并且很挑剔。 在最坏的情况下,我宁愿我的代码在启用 QuickEdit 的情况下继续运行,也不愿因此而失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM