在 Golang 中禁用快速编辑
Disable Quick Edit in Golang
我想在 Golang 中禁用快速编辑模式以避免我的终端被用户点击阻塞。
为此,我使用官方库 golang.org/x/sys/windows。
我想按照 the official microsoft doc 的描述禁用 QUICK_EDIT_MODE 并启用 EXTENDED_FLAGS。当我使用下面的代码片段时,我在 set The parameter is incorrect.
处遇到错误
我在 CMD 或 Powershell 中 运行 我在那里遇到了同样的错误。我真的不知道那里缺少什么。如果重要的话,我在 Windows 10 v20H2 19042.1586。
代码片段
import (
"os"
"golang.org/x/sys/windows"
)
...
func SetupConsole() {
winConsole := windows.Handle(os.Stdout.Fd())
var mode uint32
err := windows.GetConsoleMode(winConsole, &mode)
if err != nil {
log.Println(err)
}
log.Printf("%d", mode) <--- 3
// Disable this mode
mode &^= windows.ENABLE_QUICK_EDIT_MODE
// Enable this mode
mode |= windows.ENABLE_EXTENDED_FLAGS
log.Printf("%d", mode) <--- 131
err = windows.SetConsoleMode(winConsole, mode)
if err != nil {
log.Println(err) <--- This fails: The parameter is incorrect.
}
}
编辑:请参阅下面的答案
func SetupConsole() {
winConsole := windows.Handle(os.Stdin.Fd()) <--- Was wrong here
var mode uint32
err := windows.GetConsoleMode(winConsole, &mode)
if err != nil {
log.Println(err)
}
log.Printf("%d", mode)
// Disable this mode
mode &^= windows.ENABLE_QUICK_EDIT_MODE
// Enable this mode
mode |= windows.ENABLE_EXTENDED_FLAGS
log.Printf("%d", mode)
err = windows.SetConsoleMode(winConsole, mode)
if err != nil {
log.Println(err)
}
}
我看到两个问题。
首先你应该使用 Stdin 而不是 Stdout。您也可以只将 windows.Stdin 传入 Get/SetConsole 模式并跳过 Fd() 调用和转换。
其次,要禁用它,您只需切换 windows.ENABLE_QUICK_EDIT_MODE 标志。
同时使用 Stdout 和 ENABLE_EXTENDED_FLAGS 是导致从 SetConsoleMode
返回错误的原因
我想在 Golang 中禁用快速编辑模式以避免我的终端被用户点击阻塞。
为此,我使用官方库 golang.org/x/sys/windows。
我想按照 the official microsoft doc 的描述禁用 QUICK_EDIT_MODE 并启用 EXTENDED_FLAGS。当我使用下面的代码片段时,我在 set The parameter is incorrect.
我在 CMD 或 Powershell 中 运行 我在那里遇到了同样的错误。我真的不知道那里缺少什么。如果重要的话,我在 Windows 10 v20H2 19042.1586。
代码片段
import (
"os"
"golang.org/x/sys/windows"
)
...
func SetupConsole() {
winConsole := windows.Handle(os.Stdout.Fd())
var mode uint32
err := windows.GetConsoleMode(winConsole, &mode)
if err != nil {
log.Println(err)
}
log.Printf("%d", mode) <--- 3
// Disable this mode
mode &^= windows.ENABLE_QUICK_EDIT_MODE
// Enable this mode
mode |= windows.ENABLE_EXTENDED_FLAGS
log.Printf("%d", mode) <--- 131
err = windows.SetConsoleMode(winConsole, mode)
if err != nil {
log.Println(err) <--- This fails: The parameter is incorrect.
}
}
编辑:请参阅下面的答案
func SetupConsole() {
winConsole := windows.Handle(os.Stdin.Fd()) <--- Was wrong here
var mode uint32
err := windows.GetConsoleMode(winConsole, &mode)
if err != nil {
log.Println(err)
}
log.Printf("%d", mode)
// Disable this mode
mode &^= windows.ENABLE_QUICK_EDIT_MODE
// Enable this mode
mode |= windows.ENABLE_EXTENDED_FLAGS
log.Printf("%d", mode)
err = windows.SetConsoleMode(winConsole, mode)
if err != nil {
log.Println(err)
}
}
我看到两个问题。
首先你应该使用 Stdin 而不是 Stdout。您也可以只将 windows.Stdin 传入 Get/SetConsole 模式并跳过 Fd() 调用和转换。
其次,要禁用它,您只需切换 windows.ENABLE_QUICK_EDIT_MODE 标志。
同时使用 Stdout 和 ENABLE_EXTENDED_FLAGS 是导致从 SetConsoleMode
返回错误的原因