Private/Test-ConsoleSupportsVirtualTerminal.ps1
|
function Initialize-ColorScriptConsoleNativeType { if (-not $script:DelegateSyncRoot) { $script:DelegateSyncRoot = New-Object System.Object } try { Invoke-ModuleSynchronized $script:DelegateSyncRoot { if ('ColorScriptsEnhanced.ConsoleNative' -as [Type]) { return } $typeDefinition = @( 'using System;', 'using System.Runtime.InteropServices;', '', 'namespace ColorScriptsEnhanced {', ' public static class ConsoleNative {', ' [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 int lpMode);', '', ' [DllImport("kernel32.dll", SetLastError = true)]', ' public static extern bool SetConsoleMode(IntPtr hConsoleHandle, int dwMode);', ' }', '}' ) -join [Environment]::NewLine Add-Type -TypeDefinition $typeDefinition -ErrorAction Stop } } catch { return $false } return $null -ne ('ColorScriptsEnhanced.ConsoleNative' -as [Type]) } function Get-ColorScriptConsoleNativeDelegateSet { param( [AllowNull()] [object]$Overrides ) $getStdHandle = if ($Overrides -and $Overrides.GetStdHandle) { $Overrides.GetStdHandle } else { { param([int]$handleId) [ColorScriptsEnhanced.ConsoleNative]::GetStdHandle($handleId) } } $getConsoleMode = if ($Overrides -and $Overrides.GetConsoleMode) { $Overrides.GetConsoleMode } else { { param([IntPtr]$handle, [ref]$mode) [ColorScriptsEnhanced.ConsoleNative]::GetConsoleMode($handle, [ref]$mode) } } $setConsoleMode = if ($Overrides -and $Overrides.SetConsoleMode) { $Overrides.SetConsoleMode } else { { param([IntPtr]$handle, [int]$mode) [ColorScriptsEnhanced.ConsoleNative]::SetConsoleMode($handle, $mode) } } return @{ GetStdHandle = $getStdHandle GetConsoleMode = $getConsoleMode SetConsoleMode = $setConsoleMode } } function Enable-ColorScriptVirtualTerminal { param( [Parameter(Mandatory)] [hashtable]$Delegates ) $enableVirtualTerminalProcessing = 0x0004 $standardOutputHandle = -11 try { $handle = & $Delegates.GetStdHandle $standardOutputHandle if ($handle -eq [IntPtr]::Zero) { return $false } $mode = 0 if (-not (& $Delegates.GetConsoleMode $handle ([ref]$mode))) { return $false } if (($mode -band $enableVirtualTerminalProcessing) -ne 0) { return $true } if (-not (& $Delegates.SetConsoleMode $handle ($mode -bor $enableVirtualTerminalProcessing))) { return $false } $updatedMode = 0 if (-not (& $Delegates.GetConsoleMode $handle ([ref]$updatedMode))) { return $false } return ($updatedMode -band $enableVirtualTerminalProcessing) -ne 0 } catch { return $false } } function Test-ConsoleSupportsVirtualTerminal { [CmdletBinding()] [OutputType([bool])] param() if (-not $script:IsWindows) { return $true } $overrides = $null if ($script:ConsoleNativeOverrides -and $script:ConsoleNativeOverrides.Enabled -eq $true) { $overrides = $script:ConsoleNativeOverrides } if (-not $overrides -and -not (Initialize-ColorScriptConsoleNativeType)) { return $false } $delegates = Get-ColorScriptConsoleNativeDelegateSet -Overrides $overrides return Enable-ColorScriptVirtualTerminal -Delegates $delegates } |