【问题标题】:How to get the instance of BrowserWindow that called an event?如何获取调用事件的 BrowserWindow 的实例?
【发布时间】:2026-01-20 21:05:03
【问题描述】:

示例

您有多个 BrowserWindows 打开并存储在 BrowserWindows 数组中,您想知道哪个窗口调用了关闭事件,以便可以从数组中删除该特定 BrowserWindow。

window.on('close', () => {
   // Get the instance of the window that called this event
})

怎么做?

【问题讨论】:

    标签: electron


    【解决方案1】:

    由于event.sender 其类型为WebContents,因此您无法将其与BrowserWindow 进行比较,只有将event.senderBrowserWindow.webContents 属性进行比较,但我想这不会提供唯一标识。一种解决方法是将event.sender.idwindow.id 进行比较

    window.on ('close', (event) => {
        // Use event.sender to get the instance of the window that called this event
        console.log (event.sender.id === window.id); // -> true
    });
    

    【讨论】:

    • 我很好奇为什么event.sender 甚至存在,我使用typscript 并且虽然BrowserWindow 有许多方法覆盖,但回调的第一个参数始终是Event 类型的事件,它不是 完全包含发件人。奇怪。
    【解决方案2】:

    BrowserWindow 是一个EventEmitter;因此,窗口的实例方法on在回调函数中返回一个event参数,您可以通过event.sender属性访问窗口的实例。

    window.on ('close', (event) => {
        // Use event.sender to get the instance of the window that called this event
        console.log (event.sender instanceof BrowserWindow); // -> true
        console.log (event.sender === window); // -> true
    });
    

    【讨论】:

    • 但是event.sender它的类型WebContents,怎么可能是===BrowserWindowBrowserWindow 有一个名为 webContents 的属性,但这会提供唯一标识吗?
    • 这很奇怪...我在我的一个应用程序中测试了上面的代码,它确实可以完美运行,但只有一个主窗口...我添加了console.log (event.sender instanceof BrowserWindow),它也返回了true ...只是出于好奇,您是如何获得event.senderWebContents 类型的?
    • 也许是因为我正在使用 TypeScript,无论如何,感谢您的帮助,没有它我不会发现 event.senderevent.sender.id,所以...非常感谢 :D