Private/Rendering/Enable-VirtualTerminal.ps1
|
function Enable-VirtualTerminal { # Determine if running on Windows; $IsWindows does not exist in PS 5.1 $onWindows = if ($null -ne $IsWindows) { $IsWindows } else { $true } if (-not $onWindows) { # PS7+ on Linux/macOS supports ANSI natively return $true } try { if (-not ([System.Management.Automation.PSTypeName]'ElmConsoleHelper').Type) { Add-Type -TypeDefinition @' using System; using System.Runtime.InteropServices; public class ElmConsoleHelper { public const int STD_OUTPUT_HANDLE = -11; public const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004; [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); } '@ } $handle = [ElmConsoleHelper]::GetStdHandle([ElmConsoleHelper]::STD_OUTPUT_HANDLE) $mode = [uint32]0 if (-not [ElmConsoleHelper]::GetConsoleMode($handle, [ref]$mode)) { Write-Warning 'Enable-VirtualTerminal: GetConsoleMode failed.' return $false } $newMode = $mode -bor [ElmConsoleHelper]::ENABLE_VIRTUAL_TERMINAL_PROCESSING if (-not [ElmConsoleHelper]::SetConsoleMode($handle, $newMode)) { Write-Warning 'Enable-VirtualTerminal: SetConsoleMode failed.' return $false } return $true } catch { Write-Warning "Enable-VirtualTerminal: $_" return $false } } |