Electron开发实战之记账软件7——开机自动启动

代码仓库: https://github.com/hilanmiao/LanMiaoDesktop

2019-04-27苏南大叔electron/nwjs如何加入开机启动项? 刚好发布了这么一篇文章,用的库是node-auto-launch,不过因为我暂时先不试了,等叔叔后续文章更新再试吧,这个库支持windows、mac、linux。而我们的node-winreg只支持windows。

安装winreg模块

npm install winreg -save

添加核心代码

// 引用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中引入即可,如下图。

Electron开发实战之记账软件7——开机自动启动_第1张图片

设置开关机

我们肯定有个页面手动设置开关机了,我在Settings.vue文件中写好了。通信是用的ipc,所以主进程也要写相应的代码。需要注意的是首次不要watch autoStart这个对象,不然后多次调用相关事件。

Electron开发实战之记账软件7——开机自动启动_第2张图片Electron开发实战之记账软件7——开机自动启动_第3张图片Electron开发实战之记账软件7——开机自动启动_第4张图片

渲染进程核心代码:

 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')
            },
        }

主进程核心代码:

/**
 * 开机启动
 */
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这种工具类里,需要的时候再调用也是可以的。

效果

开发模式不好测试,我们build之后安装我们的程序,可以看到注册表和任务管理器都能看到我们的程序是启用状态(真尴尬,只有家里的电脑一直是已禁用状态XD。公司电脑,笔记本,win7、win10都是可以的。难道要设置多个注册表,或是要取得特殊权限,还是说被某个软件禁止了?)。

Electron开发实战之记账软件7——开机自动启动_第5张图片Electron开发实战之记账软件7——开机自动启动_第6张图片

申请管理员权限

2019-04-26 bug 修复: 发现已管理员身份运行,然后设置开机启动到HKLM注册表是可以的。打包的不行,必须安装的。而且打包的时候要在package.json的build参数设置申请管理员权限。所以说,我本地电脑写入HKCU不行,而公司电脑是可以的,大概率的原因就是权限和登录账户的问题。

"win": {
      "icon": "build/icons/icon.ico",
      "requestedExecutionLevel": "highestAvailable"
    },

Electron开发实战之记账软件7——开机自动启动_第7张图片

Electron开发实战之记账软件7——开机自动启动_第8张图片

签名

如果是公司产品那么推荐购买签名证书,个人的就没必要了,毕竟一年要几百刀。下面是签名和不签名的区别,windows下没那么严格,但是mac必须要签名,否则无法放到App Store上。

Electron开发实战之记账软件7——开机自动启动_第9张图片

问题:卸载的时候怎么清楚注册表中的值?

转载于:https://my.oschina.net/u/3667677/blog/3042628

你可能感兴趣的:(操作系统,json,javascript,ViewUI)