Electron 在 windows 平台下的 bug 报告

tada-zako

Electron 在 windows 平台下 setSize/setBounds 导致窗口抖动的问题

问题描述

近期在使用 Electron 开发桌面应用时,尝试实现窗口的收缩与展开功能。但是在使用 setSizesetBounds 方法时,发现窗口在展开或是收起时,总是会发生位置偏移、大小抖动的问题。经过一番查找,发现这个问题在 windows 平台下是一个已知的 bug。不过,#10862 这个 issue 中主要说明的情况是,getPosition 获取的窗口位置和实际位置不一致,但底层涉及到的问题应该是一致的。

electron issue: Per monitor DPI awareness causes issues with window positioning and sizing #10862

复现环境

  • 操作系统: Windows 11
  • Electron 版本: 36.2.1
  • Node.js 版本: 22.10.0
  • npm 版本: 11.0.0

这里列出项目的 package.json 作为参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"name": "test-window-size",
"version": "1.0.0",
"description": "test window jitter bug",
"type": "commonjs",
"main": "main.js",
"scripts": {
"start": "electron .",
"test": "echo \"Error: no test specified\" && exit 1"
},
"devDependencies": {
"electron": "^36.2.1"
}
}

复现步骤

基于最小可复现的原则,以下是复现步骤:

  1. 创建一个简单的 Electron 应用。
  2. 在主进程中调用 BrowserWindowsetSizesetBounds 方法多次调整窗口大小。
1
2
3
4
5
6
7
8
9
10
11
12
13
app.whenReady().then(() => {
createWindow()
ipcMain.handle('get-window-size', () => {
return win.getSize()
})
ipcMain.on('set-window-size', (_event, args) => {
const { width, height } = args
win.setSize(width, height)
// win.setBounds({ width: width, height: height })
})

...
})
  1. 观察窗口在调整过程中出现抖动或位置偏移的现象。
    抖动示例

预期行为

窗口应该保持左上角位置固定,向右下方延展大小。

实际行为

窗口在调整过程中会出现明显的抖动,多次触发大小变化,能十分明显的察觉到窗口偏离原本的位置。
当使用扩展屏时,主屏缩放倍率为150%,副屏缩放倍率为100%。测试发现,窗口在两个屏幕上都会出现抖动现象。
当不连接副屏时,主屏幕缩放倍率为150%,窗口在主屏幕上也会出现抖动现象。

可能原因分析

  • DPI 缩放或多显示器环境下的坐标计算误差。
  • Chromium 内核本身存在的一个 bug

窗口最大化导致材质和圆角不一致的问题

问题描述

此外,在 electron 使用过程,也发现了如下问题:electron 设置的无框浏览器窗口在最大化时,会由于最大化的方式不同,导致窗口的材质和圆角出现不一致的问题。这个问题已经被完整的描述在 #46753 中,所以这里就不再赘述了。

electron issue: Windows 11: Material (Acrylic/Mica) and Rounded Corners Inconsistencies in Frameless BrowserWindow Maximize/Restore Actions #46753

  • Title: Electron 在 windows 平台下的 bug 报告
  • Author: tada-zako
  • Created at : 2025-05-19 13:12:22
  • Updated at : 2025-05-19 05:20:47
  • Link: https://tada-zako.top/2025/技术/electron-windows-setsize-bug/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments