Windows 控制台的备用屏幕缓冲区

问题描述 投票:0回答:1

我正在寻找一种在 Windows 控制台中切换到备用屏幕缓冲区的方法。我知道它对于支持 ANSI 转义序列的终端是如何工作的,即只需将

\033[?1049h
\033[?1049l
推到标准输出即可分别切换到辅助/主缓冲区。但我想知道如何在 Windows 控制台中完成类似的事情。

以下上下文管理器是我打算在代码中使用此功能的方式:

from contextlib import contextmanager

@contextmanager
def alt_buffer():
    try:
        print("\033[?1049h\033[22;0;0t\033[0;0H", end="")
        yield
    finally:
        print("\033[?1049l\033[23;0;0t", end="")
python windows windows-console
1个回答
0
投票

嘿,我知道这个问题已经有很多年了,但这里的技巧是确保在控制台中手动请求“虚拟终端”模式。这是通过在调用

ENABLE_VT_PROCESSING
时设置
SetConsoleMode
标志来完成的。

我在here使用了一个python blob,看起来像这样:

# Turns VT output support on
def enable_vt_support():
    if os.name == 'nt':
        import ctypes
        hOut = ctypes.windll.kernel32.GetStdHandle(-11)
        out_modes = ctypes.c_uint32()
        ENABLE_VT_PROCESSING = ctypes.c_uint32(0x0004)
        # ctypes.addressof()
        ctypes.windll.kernel32.GetConsoleMode(hOut, ctypes.byref(out_modes))
        out_modes = ctypes.c_uint32(out_modes.value | 0x0004)
        ctypes.windll.kernel32.SetConsoleMode(hOut, out_modes)

您不需要对 Windows 终端执行此操作,因为默认情况下会启动带有该标志设置的进程。但为了获得最广泛的兼容性,当您知道要发出 VT 序列时,在流程开始时进行设置总是一个好主意。

回到 RS2 的控制台支持备用屏幕缓冲区,我认为是 Windows 10 build 15063。

© www.soinside.com 2019 - 2024. All rights reserved.