监听electron 双击屏幕最大化时设置右上角图片变化

本文介绍在Electron中实现窗口最大化与最小化的具体方法,并探讨如何解决最大化与最小化功能中存在的问题,例如设置不可最大化属性无效及窗口状态同步等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在electron实现窗口最大化和最小化的时候,是很简单的,只要设置主线程最大化和最小化就行了

最大化与最小化设定

// 主线程最大化
mainWin.maximize()
//主线程非最大化
 mainWin.unmaximize()
// 主线程最小化
mainWin.hide()

但是在实际执行的时候,却有很多坑比如
1、你设置了 不可以双击最大化,但是只要你拖动窗口,你设置的不可以双击最大/小化 就失效了
2、如果不监听 屏幕变化,右上角的图标就不会变化,最大化后仍显示最大化图标

//设置不可最大化属性,其实没什么用 随便拖动一下窗口,就可以双击最大化
win = new BrowserWindow({
    width: 1000,
    height: 580,
    frame: false, ///无边框
    maximizable: false, // 默认不能最大化
    resizable: false,
    minWidth: 1000,
    minHeight: 580,
  })

判断窗口是否最大化

首先想到的是判断一下是否最大化,通过文档找到查看是否最大化的函数

//判断窗口最大化的函数
win.isMaximized()

但是,当我们最大化、全屏之后,这个函数都会返回true,这样处理显然是不正确的

监听窗口最大化与非最大化变化

这时候能做的就是在主线程里监听最大化状态,然后做出相应的处理
1、主线程监听

//监听窗口最大化、最小化事件 --- 主进程
  win.on('maximize', () => {
    win.webContents.send('mainWin-max', true)
  })
  win.on('unmaximize', () => {
    win.webContents.send('mainWin-max', false)
  })

2、渲染进程接收函数
渲染进程收到事件通知执行改变窗口显示状态值的函数

//渲染进程接收函数
ipcRenderer.on('mainWin-max', (_, status) => {
    store.commit('changeSize', status)
})

3、子页面获取窗口状态值,从而改变最大化与非最大化图标

computed:{
        ...mapGetters({
            isMax: "sizeVal"
        }),
    },

页面控制图标显隐

<div class="win" @click.stop="clickMax">
          <img v-if="!isMax" src="../images/sizeMin.png" alt="">
          <img v-else src="../images/sizeMax.png" alt="">
      </div>
### 关于 `-webkit-app-region` 的用法及相关问题 #### 1. **基本概念** `-webkit-app-region` 是 Electron 中的一个 CSS 属性,用于定义窗口中的某些区域可以被拖拽以移动整个窗口。它有两个主要取值: - `drag`: 表示该区域支持拖拽操作。 - `no-drag`: 表示该区域不支持拖拽操作。 当在一个父容器上设置 `-webkit-app-region: drag` ,其所有的子元素都会继承这一属性,除非显式地将其重置为 `no-drag`[^1]。 --- #### 2. **常见问题及解决方案** ##### (1) **无法响应鼠标点击事件** 如果在某个区域内设置了 `-webkit-app-region: drag`,那么该区域内的交互事件(如按钮点击)可能会失效。这是因为浏览器会优先处理拖拽行为而忽略其他事件。 **解决方法**: 对于需要交互的子元素,应单独设置 `-webkit-app-region: no-drag`,以便恢复正常的鼠标事件监听功能。 ```html <div style="width: 100%; height: 40px; -webkit-app-region: drag;"> <button style="-webkit-app-region: no-drag;">关闭</button> </div> ``` --- ##### (2) **双击放大/缩小窗体失败** 当使用自定义标题栏并设置 `-webkit-app-region: drag` 后,可能发现双击标题栏无法实现窗口最大化或还原的操作。这通常是因为 `BrowserWindow` 配置中禁用了调整大小的功能 (`resizable: false`)。 **解决方法**: 确保 `BrowserWindow` 实例化未将 `resizable` 设定为 `false`。如果确实不需要用户手动调整尺寸,则可以通过捕获双击事件自行控制窗口状态变化[^2]。 ```javascript const { BrowserWindow } = require('electron'); let win = new BrowserWindow({ width: 800, height: 600, frame: false, resizable: true, // 确保允许调整大小 }); win.webContents.on('did-finish-load', () => { const titleBar = document.querySelector('.title-bar'); if (titleBar) { titleBar.addEventListener('dblclick', () => { if (!win.isMaximized()) { win.maximize(); } else { win.unmaximize(); } }); } }); ``` --- ##### (3) **双击放大窗口变形** 此现象可能是由于设置了透明背景 (`transparent: true`) 和特定颜色值引起的视觉偏差。具体表现为窗口边界模糊或者形状异常。 **解决方法**: 移除 `transparent: true` 并采用默认背景色即可消除此类问题[^3]。 ```javascript mainWindow = new BrowserWindow({ height: 600, width: 960, frame: false, resizable: true, transparent: false, // 默认即为此值 backgroundColor: '#ffffff' // 白色或其他合适配色方案 }); ``` --- #### 3. **最佳实践建议** 为了更好地利用 `-webkit-app-region` 创建美观实用的应用程序界面,请遵循以下几点: - 对于顶部工具条部分统一应用 `drag` 样式; - 所有可能触发动作的小部件需额外指定 `no-drag`; - 调整好全局样式表文件路径加载顺序以防冲突覆盖错误发生; - 测试不同平台下表现一致性因为 macOS Windows Linux 上可能存在细微差异。 --- ### 示例代码片段 以下是综合上述要点后的完整 HTML 结构与初始化逻辑样例: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Custom Title Bar Example</title> <style> .header { background-color: #f0f0f0; padding: 5px; cursor: move; user-select: none; -webkit-user-select: none; -webkit-app-region: drag; } button.control-btn { margin-left: 10px; border: none; background-color: inherit; color: black; font-size: 16px; cursor: pointer; outline: none; -webkit-app-region: no-drag; } </style> </head> <body> <div class="header"> My App Name <button class="control-btn">Minimize</button> <button class="control-btn">Maximize</button> <button class="control-btn">Close</button> </div> <script src="./renderer.js"></script> </body> </html> ``` ```javascript // renderer.js document.querySelectorAll('.control-btn').forEach(button => { switch (button.textContent.trim().toLowerCase()) { case 'minimize': button.onclick = () => window.electronAPI.minimizeApp(); break; case 'maximize': button.onclick = () => window.electronAPI.toggleMaximize(); break; case 'close': button.onclick = () => window.electronAPI.closeApp(); break; } }); ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值