Files
2023-03-22 11:30:21 +08:00

76 lines
1.8 KiB
Go

//go:build windows
// +build windows
package common
import (
"github.com/creack/pty"
"syscall"
"unsafe"
)
func SetConsoleVT() {
if kernel32, err := syscall.LoadDLL("kernel32.dll"); err == nil {
if GetStdHandle, err := kernel32.FindProc("GetStdHandle"); err == nil {
if GetConsoleMode, err := kernel32.FindProc("GetConsoleMode"); err == nil {
if SetConsoleMode, err := kernel32.FindProc("SetConsoleMode"); err == nil {
//仅限win10
v := int32(-11)
hand, _, _ := GetStdHandle.Call(uintptr(v))
if hand == ^uintptr(0) {
return
}
var dwMode int32
if res, _, _ := GetConsoleMode.Call(hand, uintptr(unsafe.Pointer(&dwMode))); res == 1 {
res, _, _ = SetConsoleMode.Call(hand, uintptr(dwMode|0x0004))
EnableTermVt = res == 1
}
}
}
}
}
}
type COORD struct {
X uint16
Y uint16
}
type SMALL_RECT struct {
Left uint16
Top uint16
Right uint16
Bottom uint16
}
type CONSOLE_SCREEN_BUFFER_INFO struct {
Size COORD
CursorPosition COORD
Attributes uint16
Window SMALL_RECT
MaximumWindowSize COORD
}
func GetSize() (size *pty.Winsize) {
var csbi CONSOLE_SCREEN_BUFFER_INFO
if kernel32, err := syscall.LoadDLL("kernel32.dll"); err == nil {
if GetStdHandle, err := kernel32.FindProc("GetStdHandle"); err == nil {
if GetConsoleScreenBufferInfo, err := kernel32.FindProc("GetConsoleScreenBufferInfo"); err == nil {
//仅限win10
v := int32(-11)
hand, _, _ := GetStdHandle.Call(uintptr(v))
if hand == ^uintptr(0) {
return nil
}
if res, _, _ := GetConsoleScreenBufferInfo.Call(hand, uintptr(unsafe.Pointer(&csbi))); res == 1 {
size = &pty.Winsize{}
size.Cols = csbi.Window.Right - csbi.Window.Left + 1
size.Rows = csbi.Window.Bottom - csbi.Window.Top + 1
}
}
}
}
return
}