Files
bj_power/bj_power_mes/auto_start.go
T

91 lines
2.0 KiB
Go

//go:build windows
package main
import (
"errors"
"fmt"
"os"
"path/filepath"
"strings"
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/registry"
)
var keyPath = `Software\Microsoft\Windows\CurrentVersion\Run`
func setAutoStart(appName string, exePath string) error {
// 当前用户注册表 CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
key, _, err := registry.CreateKey(registry.CURRENT_USER, keyPath, registry.ALL_ACCESS)
if err != nil {
if errors.Is(err, windows.ERROR_ACCESS_DENIED) {
return err
}
return fmt.Errorf("无法打开注册表键: %v", err)
}
defer key.Close()
absPath, err := filepath.Abs(exePath)
if err != nil {
return fmt.Errorf("获取绝对路径失败: %v", err)
}
args := getArgs()
err = key.SetStringValue(appName, fmt.Sprintf(`"%s" %s`, absPath, args))
if err != nil {
return fmt.Errorf("写入注册表失败: %v", err)
}
return nil
}
func removeAutoStart(appName string) error {
key, err := registry.OpenKey(registry.CURRENT_USER, keyPath, registry.ALL_ACCESS)
if err != nil {
if errors.Is(err, windows.ERROR_ACCESS_DENIED) {
return err
}
return fmt.Errorf("无法打开注册表键: %v", err)
}
defer key.Close()
err = key.DeleteValue(appName)
if err != nil {
return fmt.Errorf("删除注册表项失败: %v", err)
}
return nil
}
func isInRegistry(appName string) (bool, error) {
userKey, err := registry.OpenKey(registry.CURRENT_USER, keyPath, registry.QUERY_VALUE)
if err == nil {
defer userKey.Close()
_, _, err := userKey.GetStringValue(appName)
if err == nil {
return true, nil
}
}
return false, nil
}
func isAutoStartEnabled(appName string) bool {
reg, _ := isInRegistry(appName)
return reg
}
func getArgs() string {
var argsBuilder strings.Builder
for _, arg := range os.Args[1:] {
if strings.ContainsAny(arg, " \t") {
argsBuilder.WriteString(fmt.Sprintf(`"%s" `, arg))
} else {
argsBuilder.WriteString(arg + " ")
}
}
return strings.TrimSpace(argsBuilder.String())
}