|
|
// Modules to control application life and create native browser window
const {app, BrowserWindow,crashReporter} = require('electron') const ipc = require('electron').ipcMain // Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
const electron = require('electron') console.log("进入程序时间:",new Date().getTime()) const Menu = electron.Menu const Tray = electron.Tray const path =require('path') let showWindowFlg = null process.argv.forEach(e=>{ showWindowFlg = e console.log(e,showWindowFlg) }) //托盘对象
var appTray =null
let mainWindow = null,kjMain = null,miniWindow =null,kjMain_tray =null
let dateStart,dateEnd,showMulWin,gotTheLock=false
/** * 读取配置文件 * @type {boolean} */
const fs = require("fs")
const newFile_path = path.join(__dirname,'./config/config.json').replace(/\\/g,"\/")
fs.exists(newFile_path,function (exists) { console.log(exists ? "文件存在" : "文件不存在") if (exists) { console.log("配置文件",newFile_path) } }) let temp =fs.readFileSync(newFile_path) showMulWin = JSON.parse(temp).showMulWin console.log("showMulWin的值",showMulWin)
//系统托盘邮件菜单
let trayMenuTemplate = [ { label: '刷新界面', click: function () { // 如果kjMain 不为空则先关闭该窗口
if (kjMain !=null){ kjMain.restore() kjMain.reload() } // mainWindow.reload()
},//打开相应的页面
type: 'radio' }, { label: '打开调试窗口', click: function () { //console.log(kjMain.devToolsWebContents)
if (kjMain !=null){ // kjMain.webContents.openDevTools()
kjMain.webContents.send('openDevTools',"open devTools") } else { initWin() kjMain.webContents.openDevTools() } }, type: 'radio', }, ,
{ label: '显示消息通知', click: function () { if(mainWindow !=null ){ if (kjMain!=null){ kjMain.minimize() // kjMain.hide() //linux下需要去掉
} mainWindow.show() mainWindow.restore() mainWindow.setSkipTaskbar(true) } }, type: 'radio' }, { label: '最小化消息通知', click: function () { // mainWindow.close()
mainWindow.hide() console.log("hide!!!") }, type:'radio', }, { label: '打开双屏模式', click: function () { if (kjMain_tray==null){ console.log("新建browser") initWinKj() } else { console.log("已经存在新框架") kjMain_tray.restore() kjMain_tray.show() } }, type:'radio', }, { label: '退出框架系统', click: function () { if (kjMain !=null){ console.log("主进程向preload发送进程") kjMain.webContents.send('dispatchCloseButton',"回掉退出按钮") } if (setDialog !=null){ setDialog.close() } if (kjMain_tray!=null) { kjMain_tray.close() } console.log("成功退出!!!") if (kjMain!=null){ kjMain.hide() setTimeout(()=>{ kjMain.close() },500) } mainWindow.close() }, // icon: path.join(path.join(__dirname,'tray'),'tb2.png')
type:'radio', } ] function createWindow (){ console.log("chu shi hua yingyong") let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize mainWindow = new BrowserWindow({ width: 469, height: 780, //将页面显示在桌面右下角,x=屏幕宽度-窗口宽度 ,y=屏幕高度-窗口高度
/* x: screenWidth-widthx, y: screenHeight-heighty,*/ x: areaSize.width-469, y: areaSize.height-780, fullscreen:false, webPreferences: { nodeIntegration: true, // 这里是否需要node.js的支持,如果true可能和空中突击旅框架中用到的require冲突,需要设置成false。
webSecurity: true }, icon : path.join(path.join(__dirname,'tray'),'tb2.png'), transparent:true, hasShadow:false, alwaysOnTop:false, frame:false, }) if (mainWindow !=null) { mainWindow.minimize() mainWindow.hide() } mainWindow.loadFile('msgList.html') //系统托盘目录
let trayIcon =path.join(__dirname,'tray') appTray = new Tray(path.join(trayIcon,'tb2.png'))
const contextMenu = Menu.buildFromTemplate(trayMenuTemplate)
appTray.setToolTip('指挥信息系统') //修改托盘的名字,如果换成统行需要修改
appTray.setContextMenu(contextMenu)
//图片功能闪烁的实现
// var count = 0
// timer = null
// timer = setInterval(function () {
// count ++
// if (count % 2 ==0){
// appTray.setImage(path.join(trayIcon,'empty.png'))
// }else {
// appTray.setImage(path.join(trayIcon,'tb2.png'))
// }
// },500)
appTray.on('click',() => { //在linux平台下没有此功能
if (kjMain !=null){ mainWindow.isVisible() ? (mainWindow.hide(),kjMain.show()) : (mainWindow.show(),kjMain.hide()) } else { mainWindow.isVisible() ? (mainWindow.hide()) : (mainWindow.show()) }
// mainWindow.isVisible() ?
// (mainWindow.setSkipTaskbar(false),kjMain.maximize()) : (mainWindow.setSkipTaskbar(true),kjMain.maximize())
// mainWindow.show()
console.log("dian ji shijian ") // timer.Enable= false
})
mainWindow.webContents.on('dom-ready',()=>{ console.log("主进程开始时间:",new Date().getTime()) })
// mainWindow.on('show', () => {
// appTray.setHighlightMode('always')
// })
//
// mainWindow.on('hide', () => {
// appTray.setHighlightMode('never')
// })
}
function createMiniWindow (){ console.log("chu shi hua mini") let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize mainWindow = new BrowserWindow({ width: 469, height: 780, //将页面显示在桌面右下角,x=屏幕宽度-窗口宽度 ,y=屏幕高度-窗口高度
/* x: screenWidth-widthx, y: screenHeight-heighty,*/ x: areaSize.width-469, y: areaSize.height-780, fullscreen:false, webPreferences: { nodeIntegration: true, // 这里是否需要node.js的支持,如果true可能和空中突击旅框架中用到的require冲突,需要设置成false。
webSecurity: true }, icon : path.join(path.join(__dirname,'tray'),'tb2.png'), transparent:true, hasShadow:false, alwaysOnTop:false, frame:false, }) if (mainWindow !=null) { mainWindow.minimize() mainWindow.hide() } mainWindow.loadFile('msgMiniList.html') //系统托盘目录
let trayIcon =path.join(__dirname,'tray') appTray = new Tray(path.join(trayIcon,'tb2.png'))
const contextMenu = Menu.buildFromTemplate(trayMenuTemplate)
appTray.setToolTip('指挥信息系统') //修改托盘的名字,如果换成统行需要修改
appTray.setContextMenu(contextMenu)
appTray.on('click',() => { //在linux平台下没有此功能
if (kjMain !=null){ mainWindow.isVisible() ? (mainWindow.hide(),kjMain.show()) : (mainWindow.show(),kjMain.hide()) } else { mainWindow.isVisible() ? (mainWindow.hide()) : (mainWindow.show()) }
console.log("dian ji shijian ") // timer.Enable= false
}) mainWindow.minimize() mainWindow.hide() mainWindow.on('show', () => { appTray.setHighlightMode('always') })
mainWindow.on('hide', () => { appTray.setHighlightMode('never') })
}
//初始化时开启此窗口
function initWin(){ let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize //window平台时使用mainWindow.hide(),银河麒麟平台时使用mainWindow.minimize()
if (mainWindow !=null) { mainWindow.minimize() mainWindow.hide() } kjMain = new BrowserWindow({ width: areaSize.width, height: areaSize.height, // width:1129,
// height:635,
fullscreen:true, offScreen:false, webPreferences: { nodeIntegration: true, // 这里是否需要node.js的支持,如果true可能和空中突击旅框架中用到的require冲突,所以要设置成false。
webviewTag:true, webSecurity:false //跨域策略
}, backgroundColor:'#80FFFFFF', frame:false, icon : path.join(path.join(__dirname,'tray'),'tb2.png'), //show: false
}) // kjMain.hide()
kjMain.loadFile('index7.html') // /**
// * 清除缓存
// * @type {Electron.Session}
// */
// const ses=kjMain.webContents.session
// ses.clearStorageData()
kjMain.on('closed', function () { // Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
console.log("tui chu kjMain") // mainWindow.close()
kjMain = null })
kjMain.webContents.on('did-start-loading',()=>{ console.log("kai shi jiazai xin jiemian",new Date().getTime()) })
kjMain.webContents.on('dom-ready',()=>{ console.log("dom ready ..",new Date().getTime()) })
kjMain.webContents.on('did-stop-loading',()=>{ dateEnd =new Date().getTime() console.log("wancheng xin jiemian jiazai",dateEnd,dateStart) })
mainWindow.webContents.on('new-window',()=>{ console.log("new-window...",new Date().getTime()) }) } // This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
//新加载界面
function initWinKj(){ let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize kjMain_tray = new BrowserWindow({ width: areaSize.width, height: areaSize.height, // width:1129,
// height:635,
fullscreen:false, offScreen:false, webPreferences: { nodeIntegration: true, // 这里是否需要node.js的支持,如果true可能和空中突击旅框架中用到的require冲突,所以要设置成false。
webviewTag:true, webSecurity:false //跨域策略
}, backgroundColor:'#80FFFFFF', frame:true, icon : path.join(path.join(__dirname,'tray'),'tb2.png'), //show: false
}) // kjMain.hide()
kjMain_tray.loadFile('index_tray.html') kjMain_tray.on("maximize",()=>{ kjMain_tray.setMenuBarVisibility(false) kjMain_tray.setFullScreen(true) }) //登陆界面最小化
kjMain_tray.on('window-min-tray',()=>{ if (kjMain_tray!=null){ kjMain_tray.minimize() kjMain_tray.hide() } console.log("最小化框架kjmain_tray") })
kjMain_tray.on('closed', function () { // Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
console.log("tui chu kjMain_tray") // mainWindow.close()
kjMain_tray = null }) } app.commandLine.appendSwitch("--disable-http-cache") // 功能类似于Chrome 调试下“disable cache”禁止缓存的功能。必须在app.on('ready')前使用
//设置当个实例的例子
gotTheLock = app.requestSingleInstanceLock() console.log("huo qu gotTheLock de value",gotTheLock)
console.log(showMulWin,"111")
if (showMulWin =="true"){ gotTheLock = showMulWin console.log("she zhi gotTheLock de value",gotTheLock) } if (!gotTheLock) { console.log("app的信息",app) app.quit() } else { app.on('second-instance',(event,commandLine,workingDirectory)=>{ //当运行到第二个实例时,将会聚焦到myWindow这个窗口
if (mainWindow){ if (kjMain == null){ initWin() kjMain.focus() kjMain.restore() //kjMain.maximize()
}else if (kjMain.isMinimized!=undefined && kjMain.isMinimized()){ //如果最小化,就将最小化恢复
kjMain.focus() kjMain.restore() }else { kjMain.focus() kjMain.restore() kjMain.maximize() } //else if (kjMain == null){
// initWin()
//kjMain.maximize()
// }
} console.log("23232323")
}) if (showWindowFlg == 'tray'){ app.on('ready',createMiniWindow) } else { app.on('ready', createWindow) }
// app.on('ready', () =>{
// initWin();
// })
}
app.commandLine.appendSwitch('ignore-gpu-blacklist') //解决飞腾麒麟服务器显示3D地图报cesium.js的问题
// Quit when all windows are closed.
app.on('window-all-closed', function () { // On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') app.quit() })
app.on('activate', function () { // On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) createWindow() })
// app.setPath("temp","app/launhcer/custom")
//crashReporter.start()
// //登陆界面最大化
ipc.on('window-max',function (){ if (mainWindow.isMaximized()){ mainWindow.restore() } else { mainWindow.maximize() } })
// const areaSize1 = require('electron').screen.getPrimaryDisplay().workAreaSize
global.sharedObject ={ setMsgArr : [], someProperty : 'new value', dialogNum : 0 } //渲染进程间共享数据
//消息对话弹框
let dialogWin = [] ipc.on('msgLatest',(event,arg,num)=> { //console.log("mainwindow的状态",mainWindow.isMaximized(),mainWindow.isMaximized(),mainWindow.isVisible(),"kjMain的状态",kjMain.isVisible(),kjMain.isMaximized(),kjMain.isMinimized())
if ( !mainWindow.isVisible()&&kjMain.isMinimized()||!mainWindow.isVisible()&&!kjMain.isVisible()){ let areaSize1 = require('electron').screen.getPrimaryDisplay().workAreaSize let y_height = areaSize1.height // let y_height = y_height+3
dialogWin[num] = new BrowserWindow({ width: 460 , height: 360, // fullscreen:true,
x: areaSize1.width-460, y: y_height-360-3*num, webPreferences: { nodeIntegration: true // 这里是否需要node.js的支持,如果true可能和空中突击旅框架中用到的require冲突,所以要设置成false。
}, frame:false, icon : path.join(path.join(__dirname,'tray'),'tb2.png'), }) dialogWin[num].loadFile('msg_diag.html') dialogWin[num].setAlwaysOnTop(true) console.log(arg,num) } })
//消息设置窗口
let setDialog = null ipc.on('openSetDialog',(event,arg)=>{ if(setDialog !=null){ setDialog.restore() } else { console.log(arg) let areaSize1 = require('electron').screen.getPrimaryDisplay().workAreaSize // let y_height = y_height+3
setDialog = new BrowserWindow({ width: 460 , height: 360, // fullscreen:true,
x: areaSize1.width-1200, y: areaSize1.height-500, webPreferences: { nodeIntegration: true // 这里是否需要node.js的支持,如果true可能和空中突击旅框架中用到的require冲突,所以要设置成false。
}, frame:false, icon : path.join(path.join(__dirname,'tray'),'tb2.png'), }) setDialog.loadFile('setDialog.html') }
})
// 启动时初始化软件框架
ipc.on('rjkj',()=> { console.log("chu shi hua shi dakai") dateStart = new Date().getTime() initWin() }) //发送通信机制来显示框架
ipc.on('displayKJ',()=> { if (kjMain != null) { mainWindow.minimize() console.log("da kai renjia kuagnjia",kjMain.isMinimized(),!kjMain.isVisible) if (kjMain.isMinimized() || kjMain.isVisible){ //如果最小化,就将最小化恢复
kjMain.focus() kjMain.restore() kjMain.show() //kjMain.maximize()
}else { kjMain.focus() kjMain.restore() //kjMain.maximize()
console.log("启动人机框架") } //kjMain.maximize()
}else { console.log("diaoyong kj") initWin() } }) console.log("完成程序时间:",new Date().getTime()) // 获取最新消息时弹出消息通知
ipc.on('displayNotice',()=> { console.log("get latest data") console.log(mainWindow.isVisible()) if (kjMain !=null) { console.log("zhi xing 1",kjMain.isVisible(),kjMain.isMinimized()) if (!(mainWindow.isVisible()) && kjMain.isMinimized()){ console.log("only show message 1 ") mainWindow.show(); } } else { console.log("zhi xing 2") if (!(mainWindow.isVisible()) ){ console.log("only show message 2") mainWindow.show(); } } })
//登陆界面最小化
ipc.on('window-min',()=>{ if (kjMain != null) { console.log("kjmain的Minized的值:",kjMain.isMinimized()) kjMain.minimize() } console.log("最小化kjMain") }) //登陆界面最小化
ipc.on('window-min-tray',()=>{ if (kjMain_tray != null) { console.log("kjmain_tray的minisized值是:",kjMain_tray.isMinimized()) kjMain_tray.minimize() } console.log("最小化框架kjmain_tray") }) //登陆界面最关闭
ipc.on('window-close',()=>{ console.log("tuichu kj") if (kjMain !=null){ kjMain.close() } if (kjMain_tray!=null){ kjMain_tray.close() } if (mainWindow !=null){ mainWindow.close() }else { mainWindow.close() } })
//登陆界面最关闭
ipc.on('window-close-tray',()=>{ console.log("tuichu kj") if (kjMain!=null){ kjMain.close() } if (kjMain_tray!=null){ kjMain_tray.close() } if (mainWindow !=null){ mainWindow.close() }else { mainWindow.close() } })
//关闭弹窗提醒窗口
ipc.on('openDialog',(event,arg)=> { const {dialog ,shell ,nativeImage} =require('electron') dialog.showMessageBox({ type: "info", title: "消息", message : arg.text, buttons : ["确定","取消"], icon:nativeImage.createFromPath("./tray/close_button.png"),
}) })
ipc.on('closeDialog',(event,arg) =>{ // dialogWin="dialogWin"+arg
console.log("guan bi tanchuan",arg) if (dialogWin[arg] !=null){ dialogWin[arg].close() }
})
ipc.on('closeSetDialog',(event,arg) =>{ setDialog.close() setDialog = null }) // In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
|