-
Notifications
You must be signed in to change notification settings - Fork 1
/
win_term.go
36 lines (29 loc) · 1013 Bytes
/
win_term.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//go:build windows
// +build windows
package main
import (
"os"
"syscall"
"unsafe"
)
// enableVirtualTerminalProcessing enables virtual terminal processing for the given file descriptor.
func enableVirtualTerminalProcessing(fd uintptr) error {
kernel32 := syscall.NewLazyDLL("kernel32.dll")
procGetConsoleMode := kernel32.NewProc("GetConsoleMode")
procSetConsoleMode := kernel32.NewProc("SetConsoleMode")
var mode uint32
handle := syscall.Handle(fd)
// Get the current console mode
r1, _, e1 := syscall.SyscallN(procGetConsoleMode.Addr(), uintptr(handle), uintptr(unsafe.Pointer(&mode)))
if r1 == 0 {
return os.NewSyscallError("GetConsoleMode", e1)
}
// Enable virtual terminal processing
const enableVirtualTerminalProcessing uint32 = 0x0004
mode |= enableVirtualTerminalProcessing
r1, _, e1 = syscall.SyscallN(procSetConsoleMode.Addr(), uintptr(handle), uintptr(mode))
if r1 == 0 {
return os.NewSyscallError("SetConsoleMode", e1)
}
return nil
}