//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()) }