Create a PowerShell script for controlling the console input mode.
This commit is contained in:
parent
8015db36e0
commit
cf39c31ff6
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -4,6 +4,7 @@
|
|||||||
*.gyp text
|
*.gyp text
|
||||||
*.gypi text
|
*.gypi text
|
||||||
*.h text
|
*.h text
|
||||||
|
*.ps1 text eol=crlf
|
||||||
*.rst text
|
*.rst text
|
||||||
*.sh text
|
*.sh text
|
||||||
*.txt text
|
*.txt text
|
||||||
|
116
misc/ConinMode.ps1
Executable file
116
misc/ConinMode.ps1
Executable file
@ -0,0 +1,116 @@
|
|||||||
|
#
|
||||||
|
# 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"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user