Electron 3.0.0桌面应用网络断开时如何将窗口自动设为聚焦激活状态
实现方案
你在渲染进程直接调用窗口相关方法不生效,是因为Electron的顶层窗口操作API仅在主进程可用,需要通过IPC进程间通信通知主进程执行聚焦操作,修改代码如下:
第一步:修改主进程 main.js
- 引入
ipcMain模块,同时将窗口实例提升到全局作用域可访问 - 监听渲染进程发送的窗口聚焦事件,调用主进程窗口API完成操作
修改后完整代码:
const { app, BrowserWindow, ipcMain } = require('electron') // 全局存储窗口实例 let win = null function createWindow () { win = new BrowserWindow({ width: 800, height: 600 }) win.loadFile('index.html') } // 监听渲染进程发来的聚焦窗口请求 ipcMain.on('focus-app-window', () => { if (win) { // 如果窗口最小化先恢复 if (win.isMinimized()) win.restore() // 显示窗口 win.show() // 聚焦激活窗口 win.focus() // 可选:临时置顶保证切屏场景下也能弹出,需要取消置顶可以后续调用win.setAlwaysOnTop(false) win.setAlwaysOnTop(true) win.setAlwaysOnTop(false) } }) app.whenReady().then(createWindow) // 其余原有生命周期逻辑保持不变即可
第二步:修改渲染进程 render.js
引入ipcRenderer模块,在网络断开的触发逻辑里发送聚焦请求给主进程即可,修改后代码:
const { ipcRenderer } = require('electron') function disconnectInternet(onDisconnected, timeout = 2000, withoutPass = false) { uiStatus.innerText = "disconnecting..."; showNotification(); // 给主进程发消息触发窗口聚焦 ipcRenderer.send('focus-app-window') // 其余原有逻辑保持不变 ... ... }
注意事项
如果你的Electron应用开启了上下文隔离(contextIsolation: true,Electron 3.0版本默认未开启),需要通过预加载脚本(preload)暴露IPC接口,不能直接在渲染层引入ipcRenderer,对应调整预加载脚本即可。
内容的提问来源于stack exchange,提问作者Amir Danish
相关产品推荐
相关产品推荐

