Skip to content

Instantly share code, notes, and snippets.

@unakatsuo
Created March 22, 2017 00:30
Show Gist options
  • Save unakatsuo/e39b5ab5a49e6f129b1c8a12e304e265 to your computer and use it in GitHub Desktop.
Save unakatsuo/e39b5ab5a49e6f129b1c8a12e304e265 to your computer and use it in GitHub Desktop.
Check SetConsoleMode() Flags on Windows10
package main
import (
"fmt"
"os"
"github.com/Azure/go-ansiterm/winterm"
)
func main() {
fmt.Println("===>os.Stdin")
dump(os.Stdin.Fd())
inMode := modify(os.Stdin.Fd())
defer func() {
winterm.SetConsoleMode(os.Stdin.Fd(), inMode)
}()
dump(os.Stdin.Fd())
fmt.Println("===>os.Stdout")
dump(os.Stdout.Fd())
outMode := modify(os.Stdout.Fd())
defer func() {
winterm.SetConsoleMode(os.Stdout.Fd(), outMode)
}()
dump(os.Stdout.Fd())
fmt.Println("===>os.Stderr")
dump(os.Stderr.Fd())
errMode := modify(os.Stderr.Fd())
defer func() {
winterm.SetConsoleMode(os.Stderr.Fd(), errMode)
}()
dump(os.Stderr.Fd())
}
const (
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx
enableVirtualTerminalInput = 0x0200
enableVirtualTerminalProcessing = 0x0004
disableNewlineAutoReturn = 0x0008
)
func dump(fd uintptr) {
fmt.Printf("FD=%d\n", fd)
modes, err := winterm.GetConsoleMode(fd)
if err != nil {
panic(err)
}
fmt.Printf("ENABLE_ECHO_INPUT=%d, ENABLE_PROCESSED_INPUT=%d ENABLE_LINE_INPUT=%d\n",
modes&winterm.ENABLE_ECHO_INPUT,
modes&winterm.ENABLE_PROCESSED_INPUT,
modes&winterm.ENABLE_LINE_INPUT)
fmt.Printf("ENABLE_WINDOW_INPUT=%d, ENABLE_MOUSE_INPUT=%d\n",
modes&winterm.ENABLE_WINDOW_INPUT,
modes&winterm.ENABLE_MOUSE_INPUT)
fmt.Printf("enableVirtualTerminalInput=%d, enableVirtualTerminalProcessing=%d, disableNewlineAutoReturn=%d\n",
modes&enableVirtualTerminalInput,
modes&enableVirtualTerminalProcessing,
modes&disableNewlineAutoReturn)
}
func modify(fd uintptr) uint32 {
modes, err := winterm.GetConsoleMode(fd)
if err != nil {
panic(err)
}
if err := winterm.SetConsoleMode(fd, modes|enableVirtualTerminalInput); err != nil {
fmt.Println("winterm.SetConsoleMode(enableVirtualTerminalInput):", err)
}
if err := winterm.SetConsoleMode(fd, modes|enableVirtualTerminalProcessing); err != nil {
fmt.Println("winterm.SetConsoleMode(enableVirtualTerminalProcessing):", err)
}
if err := winterm.SetConsoleMode(fd, modes|winterm.ENABLE_WINDOW_INPUT); err != nil {
fmt.Println("winterm.SetConsoleMode(ENABLE_WINDOW_INPUT):", err)
}
return modes
}
PS > Get-CimInstance Win32_OperatingSystem | Select-Object Caption, Version, OSType, ServicePackMajorVersion, OSAritecture, BuildNumber | fl
Caption : Microsoft Windows 10 Pro
Version : 10.0.14393
OSType : 18
ServicePackMajorVersion : 0
OSAritecture :
BuildNumber : 14393
===>os.Stdin
FD=548
ENABLE_ECHO_INPUT=4, ENABLE_PROCESSED_INPUT=1 ENABLE_LINE_INPUT=2
ENABLE_WINDOW_INPUT=0, ENABLE_MOUSE_INPUT=16
enableVirtualTerminalInput=0, enableVirtualTerminalProcessing=4, disableNewlineAutoReturn=0
FD=548
ENABLE_ECHO_INPUT=4, ENABLE_PROCESSED_INPUT=1 ENABLE_LINE_INPUT=2
ENABLE_WINDOW_INPUT=8, ENABLE_MOUSE_INPUT=16
enableVirtualTerminalInput=0, enableVirtualTerminalProcessing=4, disableNewlineAutoReturn=8
===>os.Stdout
FD=552
ENABLE_ECHO_INPUT=4, ENABLE_PROCESSED_INPUT=1 ENABLE_LINE_INPUT=2
ENABLE_WINDOW_INPUT=0, ENABLE_MOUSE_INPUT=0
enableVirtualTerminalInput=0, enableVirtualTerminalProcessing=4, disableNewlineAutoReturn=0
winterm.SetConsoleMode(enableVirtualTerminalInput): The parameter is incorrect.
FD=552
ENABLE_ECHO_INPUT=4, ENABLE_PROCESSED_INPUT=1 ENABLE_LINE_INPUT=2
ENABLE_WINDOW_INPUT=8, ENABLE_MOUSE_INPUT=0
enableVirtualTerminalInput=0, enableVirtualTerminalProcessing=4, disableNewlineAutoReturn=8
===>os.Stderr
FD=556
ENABLE_ECHO_INPUT=4, ENABLE_PROCESSED_INPUT=1 ENABLE_LINE_INPUT=2
ENABLE_WINDOW_INPUT=8, ENABLE_MOUSE_INPUT=0
enableVirtualTerminalInput=0, enableVirtualTerminalProcessing=4, disableNewlineAutoReturn=8
winterm.SetConsoleMode(enableVirtualTerminalInput): The parameter is incorrect.
FD=556
ENABLE_ECHO_INPUT=4, ENABLE_PROCESSED_INPUT=1 ENABLE_LINE_INPUT=2
ENABLE_WINDOW_INPUT=8, ENABLE_MOUSE_INPUT=0
enableVirtualTerminalInput=0, enableVirtualTerminalProcessing=4, disableNewlineAutoReturn=8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment