Private/Test-ConsoleSupportsVirtualTerminal.ps1
|
function Test-ConsoleSupportsVirtualTerminal { [CmdletBinding()] [OutputType([bool])] param() if (-not $script:IsWindows) { return $true } $ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 $STD_OUTPUT_HANDLE = -11 if (-not $script:DelegateSyncRoot) { $script:DelegateSyncRoot = New-Object System.Object } try { Invoke-ModuleSynchronized $script:DelegateSyncRoot { if (-not ('ColorScriptsEnhanced.ConsoleNative' -as [Type])) { $typeDefinition = @( 'using System;', 'using System.Runtime.InteropServices;', '', 'namespace ColorScriptsEnhanced {', ' internal static class ConsoleNative {', ' [DllImport("kernel32.dll", SetLastError = true)]', ' internal static extern IntPtr GetStdHandle(int nStdHandle);', '', ' [DllImport("kernel32.dll", SetLastError = true)]', ' internal static extern bool GetConsoleMode(IntPtr hConsoleHandle, out int lpMode);', '', ' [DllImport("kernel32.dll", SetLastError = true)]', ' internal static extern bool SetConsoleMode(IntPtr hConsoleHandle, int dwMode);', ' }', '}' ) -join [Environment]::NewLine Add-Type -TypeDefinition $typeDefinition -ErrorAction Stop } } } catch { return $false } $overrides = $null $useOverrides = $false if ($script:ConsoleNativeOverrides -and ($script:ConsoleNativeOverrides.Enabled -eq $true)) { $overrides = $script:ConsoleNativeOverrides $useOverrides = $true } $getStdHandle = if ($useOverrides -and $overrides.GetStdHandle) { $overrides.GetStdHandle } else { { param([int]$handleId) [ColorScriptsEnhanced.ConsoleNative]::GetStdHandle($handleId) } } $getConsoleMode = if ($useOverrides -and $overrides.GetConsoleMode) { $overrides.GetConsoleMode } else { { param([IntPtr]$handle, [ref]$mode) [ColorScriptsEnhanced.ConsoleNative]::GetConsoleMode($handle, [ref]$mode) } } $setConsoleMode = if ($useOverrides -and $overrides.SetConsoleMode) { $overrides.SetConsoleMode } else { { param([IntPtr]$handle, [int]$mode) [ColorScriptsEnhanced.ConsoleNative]::SetConsoleMode($handle, $mode) } } try { $handle = & $getStdHandle $STD_OUTPUT_HANDLE if ($handle -eq [IntPtr]::Zero) { return $false } $mode = 0 if (-not (& $getConsoleMode $handle ([ref]$mode))) { return $false } if (($mode -band $ENABLE_VIRTUAL_TERMINAL_PROCESSING) -ne 0) { return $true } if (& $setConsoleMode $handle ($mode -bor $ENABLE_VIRTUAL_TERMINAL_PROCESSING)) { $updatedMode = 0 if (& $getConsoleMode $handle ([ref]$updatedMode)) { return (($updatedMode -band $ENABLE_VIRTUAL_TERMINAL_PROCESSING) -ne 0) } } } catch { return $false } return $false } |