mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-02 15:17:31 -04:00
windows: add SetConsoleMode and GetConsoleScreenBufferInfo
Add the SetConsoleMode and GetConsoleScreenBufferInfo functions, as well as the corresponding types and constants. For details see: https://docs.microsoft.com/en-us/windows/console/setconsolemode https://docs.microsoft.com/en-us/windows/console/getconsolescreenbufferinfo https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str Change-Id: I17dcd62ffde12b5c94e1245b6836d067aea3dc6e Reviewed-on: https://go-review.googlesource.com/52670 TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Alex Brainman <alex.brainman@gmail.com>
This commit is contained in:
committed by
Alex Brainman
parent
e312636bda
commit
d6c3f2be45
@@ -176,6 +176,8 @@ func NewCallbackCDecl(fn interface{}) uintptr
|
|||||||
//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW
|
//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW
|
||||||
//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId
|
//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId
|
||||||
//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
|
//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
|
||||||
|
//sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode
|
||||||
|
//sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo
|
||||||
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
|
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
|
||||||
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
|
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
|
||||||
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
|
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
|
||||||
|
|||||||
@@ -161,6 +161,8 @@ var (
|
|||||||
procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW")
|
procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW")
|
||||||
procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId")
|
procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId")
|
||||||
procGetConsoleMode = modkernel32.NewProc("GetConsoleMode")
|
procGetConsoleMode = modkernel32.NewProc("GetConsoleMode")
|
||||||
|
procSetConsoleMode = modkernel32.NewProc("SetConsoleMode")
|
||||||
|
procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo")
|
||||||
procWriteConsoleW = modkernel32.NewProc("WriteConsoleW")
|
procWriteConsoleW = modkernel32.NewProc("WriteConsoleW")
|
||||||
procReadConsoleW = modkernel32.NewProc("ReadConsoleW")
|
procReadConsoleW = modkernel32.NewProc("ReadConsoleW")
|
||||||
procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
|
procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
|
||||||
@@ -1629,6 +1631,30 @@ func GetConsoleMode(console Handle, mode *uint32) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetConsoleMode(console Handle, mode uint32) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) {
|
||||||
|
r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(&info)), 0)
|
||||||
|
if r1 == 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
err = errnoErr(e1)
|
||||||
|
} else {
|
||||||
|
err = syscall.EINVAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) {
|
func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) {
|
||||||
r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0)
|
r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0)
|
||||||
if r1 == 0 {
|
if r1 == 0 {
|
||||||
|
|||||||
@@ -1233,3 +1233,50 @@ const (
|
|||||||
IfOperStatusNotPresent = 6
|
IfOperStatusNotPresent = 6
|
||||||
IfOperStatusLowerLayerDown = 7
|
IfOperStatusLowerLayerDown = 7
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Console related constants used for the mode parameter to SetConsoleMode. See
|
||||||
|
// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
|
||||||
|
|
||||||
|
const (
|
||||||
|
ENABLE_PROCESSED_INPUT = 0x1
|
||||||
|
ENABLE_LINE_INPUT = 0x2
|
||||||
|
ENABLE_ECHO_INPUT = 0x4
|
||||||
|
ENABLE_WINDOW_INPUT = 0x8
|
||||||
|
ENABLE_MOUSE_INPUT = 0x10
|
||||||
|
ENABLE_INSERT_MODE = 0x20
|
||||||
|
ENABLE_QUICK_EDIT_MODE = 0x40
|
||||||
|
ENABLE_EXTENDED_FLAGS = 0x80
|
||||||
|
ENABLE_AUTO_POSITION = 0x100
|
||||||
|
ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200
|
||||||
|
|
||||||
|
ENABLE_PROCESSED_OUTPUT = 0x1
|
||||||
|
ENABLE_WRAP_AT_EOL_OUTPUT = 0x2
|
||||||
|
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
|
||||||
|
DISABLE_NEWLINE_AUTO_RETURN = 0x8
|
||||||
|
ENABLE_LVB_GRID_WORLDWIDE = 0x10
|
||||||
|
)
|
||||||
|
|
||||||
|
type Coord struct {
|
||||||
|
X int16
|
||||||
|
Y int16
|
||||||
|
}
|
||||||
|
|
||||||
|
type SmallRect struct {
|
||||||
|
Left int16
|
||||||
|
Top int16
|
||||||
|
Right int16
|
||||||
|
Bottom int16
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used with GetConsoleScreenBuffer to retreive information about a console
|
||||||
|
// screen buffer. See
|
||||||
|
// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str
|
||||||
|
// for details.
|
||||||
|
|
||||||
|
type ConsoleScreenBufferInfo struct {
|
||||||
|
Size Coord
|
||||||
|
CursorPosition Coord
|
||||||
|
Attributes uint16
|
||||||
|
Window SmallRect
|
||||||
|
MaximumWindowSize Coord
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user