electron 当第二个窗口被隐藏时,阻止第一个窗口的自动显示和聚焦

7vhp5slm  于 2022-12-16  发布在  Electron
关注(0)|答案(3)|浏览(508)
let firstWin = new BrowserWindow()
let secondWin = new BrowserWindow()

secondWin.hide()

假设有三个活动窗口,其中两个属于我的应用程序(firstWinsecondWin),第三个是Chrome(或任何其他应用程序),firstWin在层次结构的底部,Chrome在中间,secondWin在顶部。
秒赢
chrome
第一次成功
当我调用secondWin.hide()时,firstWin会自动弹出并获得焦点,结果如下:
第一次成功
chrome
有什么方法可以防止这种情况吗?我希望在隐藏secondWinfirstWin不弹出,而是停留在窗口层次结构的底部。

brgchamk

brgchamk1#

我相信您应该能够监听窗口的focus和/或show事件(参见https://www.electronjs.org/docs/api/browser-window
然后,您可以做出“决定”,立即在该窗口上调用hide()(我认为它有可能在屏幕上短暂 Flink )。
(How做这个决定有点棘手我想你可以记录下你调用secondWin.hide()的时间,然后用从那以后的秒数来决定...不理想!)
作为另一种方法,在调用secondWin.hide()之前,您可以查看firstWin的当前状态,如果该状态被最小化或隐藏,则可以调用app.hide()(参见https://www.electronjs.org/docs/api/app#apphide-macos)。
(除非你总是想在一个窗口隐藏时隐藏所有窗口,否则很遗憾,这不会很好地扩展到超过2个窗口。)

4c8rllxm

4c8rllxm2#

我现在使用的解决方案是将窗口的不透明度设置为零并禁用鼠标事件。

secondWin.setOpacity(0); 
secondWin.setIgnoreMouseEvents(true);

代替

secondWin.hide()

然后,每当你想让窗口再次可见时,你可以反转设置。这有点笨拙,但现在可以了。让我们看看是否有人能找到更好的解决方案。理想情况下,会有一个像window-about-to-be-shown这样的事件,你可以插入它并调用event.preventDefault()

l0oc07j2

l0oc07j23#

这是一段时间以来,最后一个答案,但这里是我如何解决这个问题:
设定

firstWin.setFocusable(false)

就在呼叫之前

secondWin.hide()

将阻止第一个窗口获得焦点。
之后,可以再次调用

firstWin.setFocusable(true)

相关问题