77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package autostart
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"os/exec"
|
||
|
|
"path/filepath"
|
||
|
|
|
||
|
|
"golang.org/x/sys/windows/registry"
|
||
|
|
)
|
||
|
|
|
||
|
|
func Enable(appName string) error {
|
||
|
|
exePath, err := os.Executable()
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("获取可执行文件路径失败: %w", err)
|
||
|
|
}
|
||
|
|
exePath, err = filepath.Abs(exePath)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("获取绝对路径失败: %w", err)
|
||
|
|
}
|
||
|
|
|
||
|
|
k, err := registry.OpenKey(registry.CURRENT_USER, `Software\Microsoft\Windows\CurrentVersion\Run`, registry.ALL_ACCESS)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("打开注册表失败: %w", err)
|
||
|
|
}
|
||
|
|
defer k.Close()
|
||
|
|
|
||
|
|
if err := k.SetStringValue(appName, exePath); err != nil {
|
||
|
|
return fmt.Errorf("设置注册表值失败: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func Disable(appName string) error {
|
||
|
|
k, err := registry.OpenKey(registry.CURRENT_USER, `Software\Microsoft\Windows\CurrentVersion\Run`, registry.ALL_ACCESS)
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("打开注册表失败: %w", err)
|
||
|
|
}
|
||
|
|
defer k.Close()
|
||
|
|
|
||
|
|
if err := k.DeleteValue(appName); err != nil {
|
||
|
|
if err == registry.ErrNotExist {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
return fmt.Errorf("删除注册表值失败: %w", err)
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func IsEnabled(appName string) bool {
|
||
|
|
k, err := registry.OpenKey(registry.CURRENT_USER, `Software\Microsoft\Windows\CurrentVersion\Run`, registry.READ)
|
||
|
|
if err != nil {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
defer k.Close()
|
||
|
|
|
||
|
|
_, _, err = k.GetStringValue(appName)
|
||
|
|
return err == nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func CreateDesktopShortcut(appName string) error {
|
||
|
|
exePath, err := os.Executable()
|
||
|
|
if err != nil {
|
||
|
|
return fmt.Errorf("获取exe路径失败: %w", err)
|
||
|
|
}
|
||
|
|
exePath, _ = filepath.Abs(exePath)
|
||
|
|
|
||
|
|
home, _ := os.UserHomeDir()
|
||
|
|
shortcutPath := filepath.Join(home, "Desktop", appName+".lnk")
|
||
|
|
|
||
|
|
psCmd := fmt.Sprintf(
|
||
|
|
`$ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut('%s'); $s.TargetPath = '%s'; $s.WorkingDirectory = '%s'; $s.Save()`,
|
||
|
|
shortcutPath, exePath, filepath.Dir(exePath))
|
||
|
|
cmd := exec.Command("powershell", "-NoProfile", "-Command", psCmd)
|
||
|
|
return cmd.Run()
|
||
|
|
}
|