【Electron】无边框窗口实现 & 自定义最小化、关闭
实现效果
实现无边框窗口
在创建窗口时,参数中加上:
titleBarStyle: 'hidden', |
顺便如果要禁止对窗口大小进行更改,再加上:
resizable:false, |
禁用滚动条
在全局css中,body
处加上:
overflow: hidden; |
拖拽窗口
- 在 CSS 中指定
-webkit-app-region: drag
来告诉 Electron 哪些区域是可拖拽的 - 在可拖拽区域内部使用
-webkit-app-region: no-drag
则可以将其中部分区域排除
自定义最小化、关闭
主要是靠 Electron 的 ipc 通信,但是我跟网上的教程很多都不行(理论上他们的方法都是没问题的),最后发现竟然是因为……
此处需要使用preload,因为Electron在(忘了哪个版本)不给直接调用ipcRenderer了(网上很多教程都过时了,我在这上面也卡了很久((
前期准备
新建一个preload.ts
,放哪看个人:
const { contextBridge,ipcRenderer } = require('electron'); |
然后在创建窗口处的webPreferences
加上(路径按个人实际改):
// 预加载脚本 |
同时将contextIsolation
改为true
然后在创建完窗口代码后面加上(其中win
就是创建的窗口)(别忘了import):
// 关闭窗口 |
引号之间的字可以根据个人习惯改~
使用
在组件中负责最小化/关闭的函数中,直接使用:
window.myApi.sendMsg('minimize'); |
个人踩坑
好了,网上大部分教程到这里就结束了(至少我看了那么那么多都是这样的),但是我个人怎么样都无法成功通信,搜了一堆又一堆,也没有找到解决方法,甚至看视频教程,别人用起来也是丝般顺滑,到底是为什么呢?小编也很好奇
看看vue页面的控制台有没有什么信息。点击按钮,可以看到这个报错:
说是sendMsg
没有定义,但是window.myApi.sendMsg('minimize');
,说明myApi
应该能读到(其实并不能)
再看Electron的dev tool
,发现他的报错竟然不太一样:
看一眼,这下破案了,他读的是dist
目录下的`preload.js``
解决
这不就简单了,直接在vite.electron.dev.ts
还有vite.electron.build.ts
里面的buildBackground()
加上:
require('esbuild').buildSync({ |
这下就没问题了!
就这么一个小小的功能,真的卡了我很久,感觉把这路上能踩的坑都踩了一遍(((
下一篇精彩继续(没错又卡了很久((
参考链接
自定义窗口 | Electron (electronjs.org)
Electron常见问题 14 - 窗口禁用滚动条_electron 滚动条-CSDN博客
Electron无边框窗口(最小化、最大化、关闭、拖动)以及动态改变窗口大小_electron ,动态配置应用参数-CSDN博客