如何解决VB.NET 控制台:使用 ANSI 序列控制台虚拟终端序列
我正在尝试在 VB.NET 中编写控制台应用程序(VS Studio Community 2019 和 .Net framework 4.8) 我无法让它正确显示 ANSI 转义序列。 我知道 this suggestion 并应用了它。 (没什么区别)
我可以使用
设置颜色Console.ResetColor()
Console.ForegroundColor = ConsoleColor.Red
和光标定位,使用
Console.SetCursorPosition(origCol + x,origRow + y)
Console.Write(s)
当我尝试这样做时
Console.WriteLine("\u001b[31mHello World!\u001b[0m")
它只是将它打印出来而不解释 ANSI 序列。
Console.OutputEncoding = Text.Encoding.XXX
只为我提供了有限的 XXX 选项,包括 Ascii、UTF8、16、32 和 Unicode。
我已经阅读了关于“控制台虚拟终端序列”的 This 文章,这似乎是 Microsoft 对 ANSI 代码的术语。本文参考setConsoleMode。
还有这个 C 代码片段,我在 vb.net 中找不到与之对应的代码
// Set output mode to handle virtual terminal sequences
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (hOut == INVALID_HANDLE_VALUE)
{
return GetLastError();
}
DWORD dwMode = 0;
if (!GetConsoleMode(hOut,&dwMode))
{
return GetLastError();
}
dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
if (!SetConsoleMode(hOut,dwMode))
{
return GetLastError();
}
我猜这两个之一可能是我的问题的答案,但我不知道如何在 VB.net 中对这些信息做任何事情。
解决方法
题名说明编程的是VB.net。然而这个语句显示
Console.WriteLine("\u001b[31mHello World!\u001b[0m")
其中使用了 C# 风格的 unicode 转义序列,\u001b。 VB 不支持转义序列。使用字符串插值和 ChrW Function 的正确 VB 语句是:
Console.WriteLine($"{ChrW(&H1B)}[31mHello World!{ChrW(&H1B)}[0m")
还有这个 C 代码片段,我在 vb.net 中找不到与之对应的代码
这将需要使用平台调用 (PInvoke) 功能来调用本机 api 函数。代码段的直接转换包含在下面定义的 SetVT100Mode
方法中。您可以在文档中或通过查看 Pinvoke.net 中的示例找到各种常量。
Imports System.Runtime.InteropServices
Module Module1
Private Const STD_INPUT_HANDLE As Int32 = -10
Private Const STD_OUTPUT_HANDLE As Int32 = -11
Private Const STD_ERROR_HANDLE As Int32 = -12
Private ReadOnly INVALID_HANDLE_VALUE As New IntPtr(-1)
Private Const ENABLE_VIRTUAL_TERMINAL_PROCESSING As UInt32 = &H4
Sub Main()
Const Esc As Char = ChrW(27)
If SetVT100Mode() = 0 Then
Console.WriteLine($"{Esc}[31mHello World!{Esc}[0m")
End If
Console.ReadLine()
End Sub
Private Function SetVT100Mode() As Int32
Dim hOut As IntPtr = GetStdHandle(STD_OUTPUT_HANDLE)
If hOut = INVALID_HANDLE_VALUE Then
Return Marshal.GetLastWin32Error()
End If
Dim mode As UInt32
If Not GetConsoleMode(hOut,mode) Then
Return Marshal.GetLastWin32Error()
End If
mode = mode Or ENABLE_VIRTUAL_TERMINAL_PROCESSING
If Not SetConsoleMode(hOut,mode) Then
Return Marshal.GetLastWin32Error()
End If
Return 0
End Function
<DllImport("kernel32.dll",SetLastError:=True)>
Private Function GetConsoleMode(ByVal hConsoleHandle As IntPtr,ByRef lpMode As UInteger) As Boolean
End Function
<DllImport("kernel32.dll",SetLastError:=True)>
Private Function SetConsoleMode(ByVal hConsoleHandle As IntPtr,ByVal dwMode As UInteger) As Boolean
End Function
<DllImport("kernel32.dll",SetLastError:=True)>
Private Function GetStdHandle(ByVal nStdHandle As Integer) As IntPtr
End Function
End Module
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。