|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
param ( |
|
[ValidateSet("on", "off")][string] $QuickEdit, |
|
[ValidateSet("on", "off")][string] $InsertMode, |
|
[int] $Mode |
|
) |
|
|
|
$signature = @' |
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
public static extern IntPtr GetStdHandle(int nStdHandle); |
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
public static extern uint GetConsoleMode( |
|
IntPtr hConsoleHandle, |
|
out uint lpMode); |
|
|
|
[DllImport("kernel32.dll", SetLastError = true)] |
|
public static extern uint SetConsoleMode( |
|
IntPtr hConsoleHandle, |
|
uint dwMode); |
|
|
|
public const int STD_INPUT_HANDLE = -10; |
|
public const int ENABLE_INSERT_MODE = 0x0020; |
|
public const int ENABLE_QUICK_EDIT_MODE = 0x0040; |
|
public const int ENABLE_EXTENDED_FLAGS = 0x0080; |
|
'@ |
|
|
|
$WinAPI = Add-Type -MemberDefinition $signature ` |
|
-Name WinAPI -Namespace ConinModeScript ` |
|
-PassThru |
|
|
|
function GetConIn { |
|
$ret = $WinAPI::GetStdHandle($WinAPI::STD_INPUT_HANDLE) |
|
if ($ret -eq -1) { |
|
throw "error: cannot get stdin" |
|
} |
|
return $ret |
|
} |
|
|
|
function GetConsoleMode { |
|
$conin = GetConIn |
|
$mode = 0 |
|
$ret = $WinAPI::GetConsoleMode($conin, [ref]$mode) |
|
if ($ret -eq 0) { |
|
throw "GetConsoleMode failed (is stdin a console?)" |
|
} |
|
return $mode |
|
} |
|
|
|
function SetConsoleMode($mode) { |
|
$conin = GetConIn |
|
$ret = $WinAPI::SetConsoleMode($conin, $mode) |
|
if ($ret -eq 0) { |
|
throw "SetConsoleMode failed (is stdin a console?)" |
|
} |
|
} |
|
|
|
$oldMode = GetConsoleMode |
|
$newMode = $oldMode |
|
$doingSomething = $false |
|
|
|
if ($PSBoundParameters.ContainsKey("Mode")) { |
|
$newMode = $Mode |
|
$doingSomething = $true |
|
} |
|
|
|
if ($QuickEdit + $InsertMode -ne "") { |
|
if (!($newMode -band $WinAPI::ENABLE_EXTENDED_FLAGS)) { |
|
|
|
|
|
|
|
$newMode = $newMode -bor $WinAPI::ENABLE_EXTENDED_FLAGS |
|
$newMode = $newMode -bor $WinAPI::ENABLE_QUICK_EDIT_MODE |
|
$newMode = $newMode -bor $WinAPI::ENABLE_INSERT_MODE |
|
$doingSomething = $true |
|
} |
|
} |
|
|
|
if ($QuickEdit -eq "on") { |
|
$newMode = $newMode -bor $WinAPI::ENABLE_QUICK_EDIT_MODE |
|
$doingSomething = $true |
|
} elseif ($QuickEdit -eq "off") { |
|
$newMode = $newMode -band (-bnot $WinAPI::ENABLE_QUICK_EDIT_MODE) |
|
$doingSomething = $true |
|
} |
|
|
|
if ($InsertMode -eq "on") { |
|
$newMode = $newMode -bor $WinAPI::ENABLE_INSERT_MODE |
|
$doingSomething = $true |
|
} elseif ($InsertMode -eq "off") { |
|
$newMode = $newMode -band (-bnot $WinAPI::ENABLE_INSERT_MODE) |
|
$doingSomething = $true |
|
} |
|
|
|
if ($doingSomething) { |
|
echo "old mode: $oldMode" |
|
SetConsoleMode $newMode |
|
$newMode = GetConsoleMode |
|
echo "new mode: $newMode" |
|
} else { |
|
echo "mode: $oldMode" |
|
} |
|
|