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(); }
注意:写入的文件要在安装程序路径上级,否则会被重新安装以后覆盖,这样无法做到自动更新时实现自动登录
努力吧,为了媳妇儿,为了家。。。

浙公网安备 33010602011771号