向基于React的Electron App添加关闭、最小化和最大化按钮

apeeds0o  于 2023-08-01  发布在  Electron
关注(0)|答案(1)|浏览(191)

我正在用React Typescript为UI框架制作一个电子应用程序,我在实现自定义标题栏的最小化,最大化和关闭按钮的功能时遇到了麻烦。
基本上,我有一个React组件WindowControlButton.tsx,它应该运行一个函数来关闭/min/max窗口。我还没有能够实现一个功能,桥梁电子和React,使窗口实际上是关闭的,虽然。
在electron的main.js文件中,我有以下内容:

webPreferences: {
    preload: path.join(__dirname, 'preload.js'),
    nodeIntegration: true,
    enableRemoteModule: true,
    contextIsolation: false,
}

字符串
preload.js中:

contextBridge.exposeInMainWorld('windowControlAPI', {

  minimizeApp: () => { ipcRenderer.send('minimize') },
  maximizeApp: () => { ipcRenderer.send('maximize') },
  closeApp:    () => { ipcRenderer.send('close') }

});


然后,回到main.js

ipcMain.on('close', () => { win.close() });

ipcMain.on('minimize', () => { win.minimize() });

ipcMain.on('maximize', () => {
    if (win.isMaximized()) win.unmaximize()
    else win.maximize()
});


最后,在WindowControlButton.tsx中,我有:

declare global {
    interface Window {
        windowControlAPI: {
            minimizeApp: () => void,
            maximizeApp: () => void,
            closeApp: () => void
        };
    }
}

// These are kind of just to show how I'm trying to use the functions I've defined above
const closeApp = () => { window.windowControlAPI.closeApp() }
const minimizeApp = () => { window.windowControlAPI.minimizeApp() }
const maximizeApp = () => { window.windowControlAPI.maximizeApp() }


注意:如果没有declare global块,Typescript会抛出错误,说windowControlAPI不存在。目前,项目编译和显示都很好,但是单击按钮会抛出Cannot read properties of undefined (reading 'closeApp')(我猜它在window.windowControlAPI上找不到closeApp()。有没有人能提出一个更好的方法来做到这一点(我已经尝试了很多不同的解决方案,所以现在看起来可能像一吨的东西混合在一起),或者为什么我的React组件似乎无法连接到电子源?
Thanks:)

k5ifujac

k5ifujac1#

无法读取undefined的属性(阅读“closeApp”)
表示窗口。windowControlAPI未定义。
你的预加载文件真的加载了吗?
你有正确的路径到你的预加载文件吗?
希望这对你有帮助!

相关问题