| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| 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" |
| } |
|
|