在 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

返回错误的原因