Go コンパイル コマンドのレビュー
go build -o tool.exe は、現在のディレクトリ内のメイン ファイルを tools.exe 実行可能ファイルにコンパイルします
:: インターフェイスレス コンパイル: go build -ldflags="-w -s -H windowsgui" -o tool 。 exe
:: 通常のビルド (デバッグ情報を削除するには -ldflags="-w -s") go build -ldflags="-w -s" -o tool.exe
問題の説明:
golang によって開発された Windows ツールは exe 実行可能ファイルにパッケージ化されており、コンパイル中にリアルタイム印刷を表示するようにコンソールが選択されています (つまり、コンパイルするインターフェイスがあります)。しかし、ユーザーが誤ってコンソールを選択してしまいます。カーソルのあるウィンドウを印刷すると、サービスが一時停止され、ユーザー カーソルがコンソール ウィンドウ領域で Enter キーを押して実行を継続します。
元のコード例:
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
}
問題の症状:
解決策:
ユーザーが誤ってコンソール ウィンドウを選択してプログラムが一時停止する問題を解決するには、Windows コンソールで SetConsoleMode 関数を使用してコンソール入力モードを設定し、コンソール ウィンドウのマウス選択機能を無効にすることができます。
Windows プラットフォームでは、 golang.org/x/sys/windows パッケージを使用して Win32 API を呼び出すことができます。このパッケージは、Windows システムによって呼び出される Go インターフェイスのセットを提供します。
go get golang.org/x/sys/windows
サンプルコードは次のとおりです。
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
}
説明:
サンプル コードでは、まず syscall.Open 関数を使用して Windows コンソール デバイス ファイル "CONIN$" を開き、そのハンドル hConsole を取得します。次に、GetConsoleMode 関数を通じてコンソールの入力モードを取得し、ビット操作を通じてコンソールの高速編集モード (つまり、マウスをダブルクリックしてテキストを選択する機能) を削除し、最後にコンソールの入力モードを更新します。 SetConsoleMode 関数。
このようにして、プログラムの実行中にユーザーはマウスを使用してコンソール ウィンドウ内のテキストを選択することができなくなり、プログラムが誤って一時停止してしまうという問題が回避されます。