2019-04-27苏南大叔electron/nwjs如何加入开机启动项? 恰好发布了这么一篇文章,用的库是node-auto-launch,不过由于我暂时先不试了,等叔叔后续文章更新再试吧,这个库支持windows、mac、linux。而咱们的node-winreg只支持windows。vue
npm install winreg -save
node
// 引用winreg模块 var WinReg = require('winreg') var startOnBoot = { // 设置自动启动 enableAutoStart: function (name, file, callback) { var key = getKey() key.set(name, WinReg.REG_SZ, file, callback || noop) }, // 取消自动启动 disableAutoStart: function (name, callback) { var key = getKey() key.remove(name, callback || noop) }, // 获取是否自动启动 getAutoStartValue: function (name, callback) { var key = getKey() key.get(name, function (error, result) { if (result) { callback(null, result.value) } else { callback(error) } }) } } var RUN_LOCATION = '\\Software\\Microsoft\\Windows\\CurrentVersion\\Run' // 获取注册表key function getKey() { return new WinReg({ hive: WinReg.HKCU, // CurrentUser, key: RUN_LOCATION }) } // callback自定义方法,你能够在这里写代码 function noop() { } // 导出 module.exports = startOnBoot
我是单首创建了一个js文件,而后在index.js中引入便可,以下图。linux
咱们确定有个页面手动设置开关机了,我在Settings.vue文件中写好了。通讯是用的ipc,因此主进程也要写相应的代码。须要注意的是首次不要watch autoStart这个对象,否则后屡次调用相关事件。git
渲染进程核心代码:github
mounted() { this.getAutoStartValue() }, methods: { changeAutoStart() { if (this.autoStart) { this.enableAutoStart() } else { this.disableAutoStart() } }, getAutoStartValue() { // 检查是否自动启动 ipcRenderer.send('getAutoStartValue') ipcRenderer.on('getAutoStartValue', (event, result) => { this.autoStart = result // 首次不watch对象 this.$watch('autoStart', this.changeAutoStart) }) }, enableAutoStart() { // 设置自动启动 ipcRenderer.send('enableAutoStart') }, disableAutoStart() { // 取消自动启动 ipcRenderer.send('disableAutoStart') }, }
主进程核心代码:web
/** * 开机启动 */ function ipcStartOnBoot() { // 检查是否自动启动 ipcMain.on('getAutoStartValue', () => { startOnBoot.getAutoStartValue(ApplicationName, (error, result) => { if (error) { mainWindow.webContents.send('getAutoStartValue', false) } else { mainWindow.webContents.send('getAutoStartValue', true) } }) }) // 设置开机自动启动 ipcMain.on('enableAutoStart', () => { startOnBoot.enableAutoStart(ApplicationName, process.execPath) }) // 取消开机自动启动 ipcMain.on('disableAutoStart', () => { startOnBoot.disableAutoStart(ApplicationName) }) }
代码不必定所有都要放在主进程main的index文件中,例如这个开关机所有放到渲染进程里的uitls这种工具类里,须要的时候再调用也是能够的。npm
开发模式很差测试,咱们build以后安装咱们的程序,能够看到注册表和任务管理器都能看到咱们的程序是启用状态(真尴尬,只有家里的电脑一直是已禁用状态XD。公司电脑,笔记本,win七、win10都是能够的。难道要设置多个注册表,或是要取得特殊权限,仍是说被某个软件禁止了?)。json
2019-04-26 bug 修复: 发现已管理员身份运行,而后设置开机启动到HKLM注册表是能够的。打包的不行,必须安装的。并且打包的时候要在package.json的build参数设置申请管理员权限。因此说,我本地电脑写入HKCU不行,而公司电脑是能够的,大几率的缘由就是权限和登陆帐户的问题。windows
"win": { "icon": "build/icons/icon.ico", "requestedExecutionLevel": "highestAvailable" },
若是是公司产品那么推荐购买签名证书,我的的就不必了,毕竟一年要几百刀。下面是签名和不签名的区别,windows下没那么严格,可是mac必需要签名,不然没法放到App Store上。