我正在寻找一种在 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="")
嘿,我知道这个问题已经有很多年了,但这里的技巧是确保在控制台中手动请求“虚拟终端”模式。这是通过在调用
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。