繁体   English   中英

控制台应用程序 window 和缓冲区大小 Windows 11

[英]Console application window and buffer sizes in Windows 11

好的,我在 Windows 11 中有一个控制台应用程序使用 .Net-7.0 并且不针对任何特定平台

当我 go 设置控制台的 window 和缓冲区大小时,它什么都不做,并且在调用Console.SetWindowSize([w], [w])Console.SetBufferSize([w], [h])之前使用OperatingSystem.IsWindows()检查操作系统是否为 Windows Console.SetBufferSize([w], [h]) IDE 抛出CA1416警告,因为它不是特定于平台的调用。

我使用IsWindows()检查没有问题,因为这只是一个测试应用程序,但我正在尝试 output 固定宽度和高度的数据(例如 REPL 应用程序,但不重绘屏幕)。 由于我无法通过System.Console API 设置 window 宽度或缓冲区宽度,因此我必须实现自己的缓冲区代码才能完成我想要做的事情。

这是 Windows 终端与 CMD 的问题吗? 如何在不引入第三方库的情况下完成我想做的事情? 我是否必须执行一些 P/Invoke 魔法才能做到这一点?

编辑:我无法更改我的目标框架,因为该程序测试的代码需要.Net-7.0

编辑 2:经过进一步诊断,我发现一个新的控制台应用程序 targeting.Net Core 3.1 将允许我以下列方式设置缓冲区宽度/高度,但它根本不会修改窗口的大小,也不会在其中工作。净7.0。 实际上只调整了缓冲区,并且需要调用Console.Clear()才能使其真正粘住。

Console.SetWindowSize(5,5);
Console.SetBufferSize(5,5);
Console.Clear();

根据经典控制台 API 与虚拟终端序列

我们的建议是用虚拟终端序列替换经典的 Windows 控制台 API。 本文将概述两者之间的区别,并讨论我们推荐的原因。

定义 经典的 Windows Console API 表面定义为 kernel32.dll 上的一系列 C 语言功能接口,名称中包含“Console”。

...

跨平台支持

跨平台原生支持虚拟终端序列,使终端应用程序和命令行实用程序可以在操作系统的版本和变体之间轻松移植,Windows 除外。

相比之下, Windows 控制台 API 仅在 Windows 上受支持 当试图从一个或另一个平台移植命令行实用程序时,必须在 Windows 和虚拟终端之间编写扩展适配器或翻译库,反之亦然。

在 OP 中,您指定了 Windows 控制台 API

  • Console.SetWindowSize
  • Console.SetBufferSize

但声明您没有针对任何特定平台,这就是您收到以下消息的原因:

CA1416: This call site is reachable on all platforms. 'Console.SetBufferSize(int, int)' is only supported on: 'windows'.

CA1416: This call site is reachable on all platforms. 'Console.SetWindowSize(int, int)' is only supported on: 'windows'.

两条消息 state: only supported on: 'windows' ,这意味着如果你想使用它们,你需要定位到Windows

目标 Windows (VS 2022):

  • 在 VS 菜单中,单击项目
  • Select <项目名称> 属性
  • 目标操作系统下,select Windows

清洁和重建。

另请参阅: SDK 样式项目中的目标框架


以下代码改编自此处并经过测试。 在将目标操作系统设置为Windows后,它可以与 .NET 7 一起使用。

static void Main(string[] args)
{
    int width = 80;
    int height = 10;

    if (Console.WindowLeft + Console.WindowWidth < width && Console.WindowTop + Console.WindowHeight < height)
        System.Console.SetBufferSize(width, height);

    System.Console.SetWindowSize(width, height);

    for (int i = 0; i < height; i++)
    {
        Console.WriteLine($"line {i + 1}");
    }
}

其他资源

暂无
暂无

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

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