91 lines
2.0 KiB
Go
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())
|
||
|
|
}
|