Electron 其实提供的跨平台的通用开机自启动支持。
但是因为Windows系统的限制,如果您的Electron在运行时要使用管理员权限的话,这样设置的自启动会失效。
目前解决方法有两种,一种是服务,另一种是写注册表启动项
服务的方案,优点就是,在启动的时候不会弹出UAC,缺点是,需要额外的精力来维护这个服务支持组件。
所以,个人比较推荐使用写注册表的方式
缺点就是开机会弹UAC~ 不过无伤大雅
如果强制使用32位路径的话添加 `/reg:32`
1let cp = require('child_process');
2// 获取可执行文件位置
3const ex=process.execPath;
4
5// 定义事件,渲染进程中直接使用
6
7// 开启 开机自启动
8ipcMain.on('openAutoStart',()=>{
9 console.log('updateExe',ex)
10 // 注释的是electron官方提供的自启方法
11 // app.setLoginItemSettings({
12 // openAtLogin: true,//是否自启
13 // openAsHidden:false,//启动后是否显示窗体
14 // path: ex,//启动路径
15 // args: [] //启动时的参数
16 // });
17 cp.exec(`REG ADD HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v 软件名 /t REG_SZ /d "${ex}" /f`,function(err){
18 console.log(err);
19 });
20});
21// 关闭 开机自启动
22ipcMain.on('closeAutoStart',()=>{
23 // 注释的是electron官方提供的自启方法
24 // app.setLoginItemSettings({
25 // openAtLogin: false,//是否自启
26 // openAsHidden:false,//启动后是否显示窗体
27 // path: ex,//启动路径
28 // args: [] //启动时的参数
29 // });
30 cp.exec("REG DELETE HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v 软件名 /f",function(err){
31 console.log(err);
32 });
33})
34
35//检查注册表项是否存在
36ipcMain.handle('checkAutoStart',async ()=>{
37 return await new Promise((resolve, reject)=>{
38 cp.exec("REG QUERY HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v 软件名",function(err,stdout,stderr){
39 resolve(stdout);
40 console.log(stderr);
41 console.log(err);
42 });
43 })
44})
更多用法可以使用 `REG /?` 命令查看