+++ /dev/null
-#
-# PowerShell script for controlling the console QuickEdit and InsertMode flags.
-#
-# Turn QuickEdit off to interact with mouse-driven console programs.
-#
-# Usage:
-#
-# powershell .\ConinMode.ps1 [Options]
-#
-# Options:
-# -QuickEdit [on/off]
-# -InsertMode [on/off]
-# -Mode [integer]
-#
-
-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)) {
- # We can't enable an extended flag without overwriting the existing
- # QuickEdit/InsertMode flags. AFAICT, there is no way to query their
- # existing values, so at least we can choose sensible defaults.
- $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"
-}