From d18880c4733f3181d0305246aae2fe07f47f852d Mon Sep 17 00:00:00 2001 From: taynpg Date: Mon, 23 Mar 2026 11:01:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0cmd=E5=BD=A9=E8=89=B2?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E8=AE=BE=E7=BD=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- golang/logUse/ansi/ansi_support.go | 10 ++++++ golang/logUse/ansi/ansi_support_win.go | 49 ++++++++++++++++++++++++++ golang/{ => logUse}/logUse.go | 0 3 files changed, 59 insertions(+) create mode 100644 golang/logUse/ansi/ansi_support.go create mode 100644 golang/logUse/ansi/ansi_support_win.go rename golang/{ => logUse}/logUse.go (100%) diff --git a/golang/logUse/ansi/ansi_support.go b/golang/logUse/ansi/ansi_support.go new file mode 100644 index 0000000..a08e643 --- /dev/null +++ b/golang/logUse/ansi/ansi_support.go @@ -0,0 +1,10 @@ +//go:build !windows +// +build !windows + +package ansi + +// EnableANSIConsole 启用控制台 ANSI 转义序列支持 +// 在非 Windows 系统上,默认已支持 ANSI 转义序列 +func EnableANSIConsole() bool { + return true +} diff --git a/golang/logUse/ansi/ansi_support_win.go b/golang/logUse/ansi/ansi_support_win.go new file mode 100644 index 0000000..27d8f83 --- /dev/null +++ b/golang/logUse/ansi/ansi_support_win.go @@ -0,0 +1,49 @@ +//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 +} diff --git a/golang/logUse.go b/golang/logUse/logUse.go similarity index 100% rename from golang/logUse.go rename to golang/logUse/logUse.go