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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从我的应用程序关闭Windows 10控制台“标记”模式相关的知识,希望对你有一定的参考价值。

我有一个用Python编写的控制台应用程序。 Windows 10控制台的“标记”模式令我感到沮丧,因为用户在执行像切换窗口这样简单的操作时不小心点击了应用程序。我有办法控制并阻止它吗?

对于那些不知道Mark模式的人来说,就是当用户在控制台窗口中选择一些文本时。当程序接下来写入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,因为所涉及的方法的os实现是未知的,并且已知会引发异常并且很挑剔。在最糟糕的情况下,我宁愿我的代码继续运行QuickEdit而不是因为它而失败。

以上是关于从我的应用程序关闭Windows 10控制台“标记”模式的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件从我的 Windows 7 计算机传输到 Amazon EC2 实例? [关闭]

如何控制 iPhone 系统音量? [关闭]

如何从另一个桌面应用程序控制 Windows 服务

Visual Studio C#远程调试关闭windows服务

当打开的控制台窗口关闭时,如何防止我的程序关闭?

通过 Windows 10“设置”应用程序和旧版控制面板卸载应用程序有啥区别? [关闭]