50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package ansi
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
// Windows API 常量定义
|
|
const (
|
|
STD_OUTPUT_HANDLE = uintptr(4294967285) // -11
|
|
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
|
|
)
|
|
|
|
var (
|
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
procGetStdHandle = kernel32.NewProc("GetStdHandle")
|
|
procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
|
|
procSetConsoleMode = kernel32.NewProc("SetConsoleMode")
|
|
)
|
|
|
|
// EnableANSIConsole 启用 Windows 控制台 ANSI 转义序列支持
|
|
func EnableANSIConsole() bool {
|
|
// 获取标准输出句柄
|
|
stdout, _, _ := procGetStdHandle.Call(STD_OUTPUT_HANDLE)
|
|
if stdout == 0 || stdout == uintptr(syscall.InvalidHandle) {
|
|
return false
|
|
}
|
|
|
|
// 获取当前控制台模式
|
|
var mode uint32
|
|
ret, _, _ := procGetConsoleMode.Call(stdout, uintptr(unsafe.Pointer(&mode)))
|
|
if ret == 0 {
|
|
return false
|
|
}
|
|
|
|
// 启用虚拟终端处理
|
|
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
|
|
|
// 设置新的控制台模式
|
|
ret, _, _ = procSetConsoleMode.Call(stdout, uintptr(mode))
|
|
if ret == 0 {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|