electron [Bug]:当手动隐藏或显示BrowserWindow时,渲染视图会保留上一次的渲染结果,看起来像是渲染的阴影,

g6ll5ycj  于 5个月前  发布在  Electron
关注(0)|答案(8)|浏览(73)

预检清单

Electron 版本

25.9.1

您正在使用的操作系统是什么?

macOS

您正在使用的操作系统版本是什么?

12.2.1

您正在使用的架构是什么?

arm64(包括 Apple Silicon)

最后已知正常工作的 Electron 版本

  • 无响应*

预期行为

当我控制隐藏或显示 browserWindows 时,正常渲染。

实际行为

为了更清晰地展示,我设置了一个间隔来随机更改文本。当我点击隐藏,然后通过快捷键显示窗口时,您可以看到红色文字后面的灰色文字。

测试用例 Gist URL

https://gist.github.com/rictt/5a2fde1077782959cf5779f059c8e660

其他信息

  • 无响应*
1bqhqjot

1bqhqjot1#

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    body,
    html {
      width: 100%;
      height: 100%;
      background-color: rgba(0, 0, 0, 0.1);
    }

    .random {
      font-size: 80px;
      color: red;
      text-align: center;
      margin: 40px 0;
    }
    button {
      font-size: 30px;
      padding: 5px 10px;
    }
  </style>
</head>

<body>
  <div class="random"><span id="random"></span></div>
  <div>
    <button id="hide">hide</button>
    <button id="show">show</button>
  </div>
  <script>
    const span = document.querySelector('#random')
    const hideBtn = document.querySelector('#hide')
    const showBtn = document.querySelector('#show')

    showBtn.addEventListener('click', () => {
      window.ipcRenderer.invoke('window:show')
    })
    hideBtn.addEventListener('click', () => {
      window.ipcRenderer.invoke('window:hide')
    })

    const setRandom = () => {
      const randomText = Math.random().toString(16).slice(-12).toUpperCase()
      span.innerText = randomText
    }

    setInterval(() => {
      setRandom()
    }, 2000)

    setRandom()
  </script>
</body>

</html>
nr7wwzry

nr7wwzry2#

preload.js

const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('ipcRenderer', ipcRenderer)
window.ipcRenderer = ipcRenderer
oyjwcjzk

oyjwcjzk3#

main.js

const { app, shell, BrowserWindow, globalShortcut, ipcMain } = require('electron')
const { join } = require('path')

let mainWindow

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 1200,
    height: 900,
    title: '',
    show: true,
    transparent: true,
    // frame: false,
    // alwaysOnTop: true,
    webPreferences: {
      devTools: true,
      preload: join(__dirname, './perload.js'),
      sandbox: false
    }
  })

  console.log(1234)

  mainWindow.setAlwaysOnTop(true, 'screen-saver')
  // 设置窗口在所有工作区都可见
  mainWindow.setVisibleOnAllWorkspaces(true)

  mainWindow.on('ready-to-show', () => {
    mainWindow.show()
  })

  ipcMain.handle('window:show', () => {
    mainWindow.show()
  })
  ipcMain.handle('window:hide', () => {
    mainWindow.hide()
  })

  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url)
    return { action: 'deny' }
  })

  mainWindow.loadFile(join(__dirname, './index.html'))
}

function whenAppReady() {
  createWindow()

  globalShortcut.register('f2', () => {
    mainWindow.show()
  })

  globalShortcut.register('esc', () => {
    mainWindow.hide()
  })

  app.on('activate', function () {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
}

app.whenReady().then(() => {
  whenAppReady()
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
qij5mzcb

qij5mzcb4#

@rictt could you please put this in a gist for simplicity?

rur96b6h

rur96b6h5#

@rictt could you please put this in a gist for simplicity?
sure, please click here

hujrc8aj

hujrc8aj6#

这里有进展吗?

pvcm50d1

pvcm50d17#

这个问题已经被自动标记为过时。如果这个问题仍然影响到你,请留下任何评论(例如“提升”),我们会保持开放。如果你有任何新的附加信息——特别是,如果这个问题在 latest version of Electronbeta 中仍然可复现——请在你的评论中包含它!

zvokhttg

zvokhttg8#

这个问题已经被自动标记为过时。如果这个问题仍然影响到你,请留下任何评论(例如“提升”),我们会保持开放。如果你有任何新的附加信息——特别是,如果这个问题在 latest version of Electronbeta 中仍然可复现——请在你的评论中包含它!

相关问题