Electron集成其他桌面程序时记录登录账号
最近在实现Electron编写一个桌面程序,集成医院his系统,在his中通过调取已经装好的Electron exe程序,调取Electron exe程序时需要参入参数(登录账号信息),可通过以下命令获得参数:
process.argv
但是每次his重新加载后调起后,可能多次调起Electron exe程序,需要kill前面的程序,保证只起一个程序
解决方法:
每次启动程序后写入一个文件,记录当前账号以及进程id
启动程序时去读取当前文件,如果判断到账号未修改则退出新启动的exe程序
自动更新时,会重新启动程序,次数的参数会变为“--updated”,也需要从文件中获取,实现自动登录
具体代码如下,需要在写入启动文件中:
import { app, BrowserWindow, ipcMain, shell } from 'electron' import path from "path" import fs from "fs" // 查找之前是否有进程,并杀掉 import childProcess from 'child_process' const exec = childProcess.exec const killProcess = (pid) => { let cmd = process.platform === 'win32' ? 'tasklist' : 'ps aux' exec(cmd, function (err, stdout, stderr) { if (err) { return console.error(err) } const lines = stdout.split('\n'); for(let line of lines){ const processMessage = line.trim().split(/\s+/) if(processMessage[0].startsWith('xiaobao')) console.log(processMessage, 'pidpidpid1') if(processMessage[1] == pid){ console.log(pid, 'find kill') // process.kill(pid) break; } } }) } const findProcess = (pid, cb) => { let cmd = process.platform === 'win32' ? 'tasklist' : 'ps aux' exec(cmd, function (err, stdout, stderr) { if (err) { return console.error(err) } let re = null; const lines = stdout.split('\n'); for(let line of lines){ const processMessage = line.trim().split(/\s+/) if(processMessage[1] == pid){ console.log(processMessage[1], 'sssss'); re = processMessage; break; } } cb(re) }) } const writeFile=(path, data)=>{ fs.writeFile(path, JSON.stringify(data),(err) => { if (err) { throw err; } console.log(err); }); } const bootApp =()=>{ let user = process.argv[process.argv.length - 1]; const logsPath = path.join(app.getAppPath(), '../../../') + '/logs'; // 判断是否重新启动小宝 fs.exists(logsPath, (exists)=> { if(exists){ // 读取文件 fs.readFile(logsPath, function (err, data) { if (err) { return console.error(err); } let logsInfo = {} try{ logsInfo = JSON.parse(data.toString()); }catch(e){ console.log(e); } // 判断是否存在进程,或者通过别的渠道将进程已经关闭 findProcess(logsInfo.pid,(data)=>{ // 如果存在进程 if(data){ // 如果账户不相同,则关闭前面进程,重新启动 if(logsInfo.user !== user){ console.log('user changed, kill old pro and write new info', user, logsInfo.pid); if(user === '--updated'){ console.log('auto update, user not change', logsInfo.user); global.arguments.push(logsInfo.user) user = logsInfo.user } writeFile(logsPath, { user, pid: process.pid }); process.kill(logsInfo.pid) }else{ // 否则退出当前程序 console.log('same user, app quit') app.quit() } }else{ // 如果进程不存在需要写入新起的进程数据 console.log('process not exit, write info'); // 如果判断是自动更新时,自动更新的参数为‘--updated’ if(user === '--updated'){ console.log('auto update, user not change', logsInfo.user); global.arguments.push(logsInfo.user) user = logsInfo.user } writeFile(logsPath, { user, pid: process.pid }); } }) }); }else{ // 不存在文件写文件 writeFile(logsPath, { user, pid: process.pid }); } }) } export { killProcess, findProcess, bootApp }
在main.dev.js中引入
if (process.env.NODE_ENV === 'production') { const sourceMapSupport = require('source-map-support'); sourceMapSupport.install(); const proSetting = require('./prod.setting.js'); proSetting.bootApp(); }
注意:写入的文件要在安装程序路径上级,否则会被重新安装以后覆盖,这样无法做到自动更新时实现自动登录
努力吧,为了媳妇儿,为了家。。。