electron 进程间通信

预加载脚本

1.src-electron添加preload.js

2.将preload.js挂载到主进程中

复制代码
// 创建浏览器窗口时,调用这个函数。
const createWindow = () => {
  const win = new BrowserWindow({
    width: 1600,
    height: 700,
    // title: '11111111',
    icon: join(__dirname, '../public/login1.png'),
    webPreferences: {
      // 引入预加载脚本
      preload: join(__dirname, 'preload.js')
    }
  })

  // development模式
  if (process.env.VITE_DEV_SERVER_URL) {
    win.loadURL(process.env.VITE_DEV_SERVER_URL)
    // 开启调试台
    win.webContents.openDevTools()
  } else {
    win.loadFile(join(__dirname, '../dist/index.html'))
  }

  Menu.setApplicationMenu(null)
}
复制代码

 

主进程使用 BrowserWindow 创建实例,主进程销毁后,对应的渲染进程回被终止。主进程与渲染进程通过 IPC 方式(事件驱动)进行通信。

单向通信(使用使用 ipcRenderer.send API 发送消息,然后使用 ipcMain.on API 接收)

1.在预加载脚本中添加(会被挂载到window上)

const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
  // 单向
  setTitle: (title) => ipcRenderer.send('set-title', title)
})

2.在主进程中接收

复制代码
const {  ipcMain } = require('electron')
ipcMain.on('set-title', (event, title) => {
  // 获取当前的窗口
  const webContents = event.sender
  const win = BrowserWindow.fromWebContents(webContents)

  // 设置窗口标题  setTitle是electron内置的方法
  win.setTitle(title)
})
复制代码

3.在渲染进程中调用

复制代码
<script setup lang="ts">
const { electronAPI } = window

const changeTitle = () => {
  electronAPI.setTitle(title.value)
  console.log(electronAPI?.node())
  console.log(electronAPI?.chrome())
  console.log(electronAPI?.electron())
}
</script>
复制代码

 

双向通信(使用使用 ipcRenderer.invokeAPI 发送消息,然后使用 ipcMain.handleAPI 接收) 

1.在预加载脚本中添加(会被挂载到window上)
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
  // 双向
  postMessage: () => ipcRenderer.invoke('post-message')
})

2.在主进程中接收

const {  ipcMain } = require('electron')
ipcMain.handle('post-message', async () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('支付宝到账100万元')
    }, 2000)
  })
})

3.在渲染进程中调用

复制代码
<script setup lang="ts">
import { ref } from 'vue'
const message = ref('')

const { electronAPI } = window

const sentMessage = async () => {
  message.value = await electronAPI?.postMessage()
}

</script>
复制代码

进程间通信官网:https://www.electronjs.org/zh/docs/latest/tutorial/ipc

 

electron更多可操作的功能(系统级)

 https://www.electronjs.org/zh/docs/latest/tutorial/examples

posted on   sss大辉  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示