-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathautostart.go
More file actions
60 lines (54 loc) · 1.81 KB
/
Copy pathautostart.go
File metadata and controls
60 lines (54 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package main
import (
"fmt"
"os"
"strings"
"golang.org/x/sys/windows/registry"
)
// ---------------- 开机自启(HKCU Run 注册表项) ----------------
// 开机自启注册表位置:HKCU\Software\Microsoft\Windows\CurrentVersion\Run
// 仅当前用户生效,无需管理员权限;用户也可在任务管理器"启动"页中自行启停
const (
autoStartRegPath = `Software\Microsoft\Windows\CurrentVersion\Run`
autoStartValueKey = "FileManager" // 与 settings.json 目录名、单实例互斥名保持一致
)
// applyAutoStart 写入/删除开机自启注册表项
func applyAutoStart(enabled bool) error {
k, err := registry.OpenKey(registry.CURRENT_USER, autoStartRegPath, registry.QUERY_VALUE|registry.SET_VALUE)
if err != nil {
return fmt.Errorf("打开开机自启注册表键失败:%v", err)
}
defer k.Close()
if enabled {
exe, err := os.Executable()
if err != nil {
return fmt.Errorf("获取程序路径失败:%v", err)
}
// 带引号包裹路径,防止路径含空格时启动失败
if err := k.SetStringValue(autoStartValueKey, `"`+exe+`"`); err != nil {
return fmt.Errorf("写入开机自启注册表失败:%v", err)
}
} else {
if err := k.DeleteValue(autoStartValueKey); err != nil && err != registry.ErrNotExist {
return fmt.Errorf("移除开机自启注册表失败:%v", err)
}
}
return nil
}
// isAutoStartEnabled 检查注册表中是否已注册本程序开机自启
func isAutoStartEnabled() bool {
k, err := registry.OpenKey(registry.CURRENT_USER, autoStartRegPath, registry.QUERY_VALUE)
if err != nil {
return false
}
defer k.Close()
val, _, err := k.GetStringValue(autoStartValueKey)
if err != nil {
return false
}
exe, err := os.Executable()
if err != nil {
return false
}
return strings.Contains(strings.ToLower(val), strings.ToLower(exe))
}