La plataforma de desarrollo de Windows de Golang resuelve el problema de que los usuarios seleccionen accidentalmente la ventana de la consola y provoquen que el programa se detenga.

Vaya a la revisión del comando de compilación
go build -o tool.exe compilará el archivo principal en el directorio actual en el archivo ejecutable tool.exe
:: Compilación sin interfaz: go build -ldflags="-w -s -H windowsgui" -o tool. exe
:: Compilación normal (-ldflags="-w -s" para eliminar información de depuración) vaya a compilar -ldflags="-w -s" -o tool.exe

Descripción del problema:
las herramientas de Windows desarrolladas por golang están empaquetadas en archivos ejecutables exe y la consola se selecciona para mostrar la impresión en tiempo real durante la compilación (es decir, hay una interfaz para compilar), pero el usuario seleccionará la consola sin darse cuenta ventana de impresión con el cursor, lo que hace que el servicio se detenga y el cursor del usuario En el área de la ventana de la consola, presione la tecla Intro para continuar con la ejecución.

Ejemplo de código original :

package main

import (
	"fmt"
	"time"
)


func main() {
    
    
	// 在控制台输出一些测试信息
	for i := 1; i <= 10; i++ {
    
    
		fmt.Printf("第 %d 行\n", i)
		time.Sleep(time.Second * 2)
	}

	// 编译成.exe文件命令: go build tool.go
}

Síntomas del problema :
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

Solución :
Para resolver el problema del usuario que selecciona accidentalmente la ventana de la consola y hace que el programa se detenga, puede usar la función SetConsoleMode en la consola de Windows para configurar el modo de entrada de la consola y deshabilitar la función de selección del mouse de la ventana de la consola.
En la plataforma Windows, puede utilizar el paquete golang.org/x/sys/windows para llamar a la API Win32, que proporciona un conjunto de interfaces Go llamadas por el sistema Windows.

go get golang.org/x/sys/windows

Aquí hay un código de muestra:

package main

import (
	"fmt"
	"golang.org/x/sys/windows"
	"time"
)

const ENABLE_QUICK_EDIT_MODE = 0x0040

// ForbiddenConsoleEdit 禁止控制台窗口的鼠标选择功能
func ForbiddenConsoleEdit() error {
    
    
	hConsole, err := windows.GetStdHandle(windows.STD_INPUT_HANDLE)
	if err == nil {
    
    
		mode := uint32(0)
		err = windows.GetConsoleMode(hConsole, &mode)
		if err == nil {
    
    
			mode &^= ENABLE_QUICK_EDIT_MODE
			if err := windows.SetConsoleMode(hConsole, mode); err != nil {
    
    
				return err
			} else {
    
    
				return nil
			}
		} else {
    
    
			return err
		}
	} else {
    
    
		return err
	}
}

func main() {
    
    
	// 禁止控制台窗口的鼠标选择功能(鼠标点击控制器或选择控制台打印的内容,会暂停程序运行,鼠标移开程序才能继续运行)
	if err := ForbiddenConsoleEdit(); err != nil {
    
    
		fmt.Println("设置失败", err.Error())
	} else {
    
    
		fmt.Println("设置成功")
	}

	// 在控制台输出一些测试信息
	for i := 1; i <= 10; i++ {
    
    
		fmt.Printf("第 %d 行\n", i)
		time.Sleep(time.Second * 2)
	}

	// 编译成.exe文件命令: go build tool.go
}

Explicación:
En el código de muestra, primero usamos la función syscall.Open para abrir el archivo del dispositivo de la consola de Windows "CONIN$" y obtener su identificador hConsole. Luego, obtenga el modo de entrada de la consola a través de la función GetConsoleMode, elimine el modo de edición rápida de la consola (es decir, la función de hacer doble clic con el mouse para seleccionar texto) mediante operaciones de bits y finalmente actualice el modo de entrada de la consola a través de la función SetConsoleMode.

De esta manera, el usuario no puede utilizar el mouse para seleccionar texto en la ventana de la consola mientras el programa se está ejecutando, evitando así el problema de hacer que el programa se detenga inadvertidamente.

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_38923792/article/details/130811387
Recomendado
Clasificación