求教为什么electron的isMaximized()值一直是false?

萌新最近在试图学习react和electron,想实现双击App组件时窗口在最大化和
正常大小之间切换,并在渲染进程中给出反馈;已经在渲染进程中绑定了双击事
件并向主进程发送信息

//这是新建窗口的属性
let win = new BrowserWindow({
        show: false,
        width: 1320,
        height: 720,
        frame: false,
        resizable: false,
        transparent: true,
        hasShadow: true,
        webPreferences: {
            preload: path.join(__dirname, 'preload.js'),
            nodeIntegration: true,
            webSecurity: true,
            webviewTag: true
        },
    })
//渲染进程内的
class App extends React.Component {

    winSizeChange(){
        ipcRenderer.send('change-size');
    }

    render() {
        return (
          <AppBase className="App" onDoubleClick={() => this.winSizeChange()}>
            <header className="App-header">
              <img src={logo} className="App-logo" alt="logo" />
              <InputComponent />
            </header>
          </AppBase>
        );
    }
}

主进程接收信息后判断是否是最大化,做出相应动作并向渲染进程发送信息

//主进程内的
ipcMain.on('change-size', function() {
        win.isMaximized() ?  win.setFullscreen(true) : win.maximize();
        win.webContents.send('isMax',win.isMaximized())
    })
//渲染进程内的接收函数
ipcRenderer.on('isMax',(event,arg) => {
        console.log(arg)
    });

但是一开始窗口点击会最大化一次然后打印出来false,之后一直都是false
再也不会变回去,不知道是为什么。。。
大佬们帮忙看看啊_(:з」∠)_,感激不尽

参考GPT和自己的思路:

根据你提供的代码和描述,我可以看出可能出现问题的几个地方:

  1. win 对象在主进程中创建,但渲染进程不知道它的状态,因此渲染进程不应该直接调用 win.isMaximized()。应该让主进程根据用户的输入执行相应的操作,并通过 IPC 向渲染进程传递状态信息。

  2. 你的代码中尝试在双击事件处理程序内执行 ipcRenderer.send('change-size') 来通知主进程。这种处理方式会导致 IPC 通信发送的可能性,并使主渲染进程的竞争条件更加复杂。

为了解决这些问题,你可以尝试以下几个步骤:

  1. 主进程应该为 BrowserWindow 对象定义一个全局的变量,并为该对象处理 createWindow 函数。像下面这样:
let win;

function createWindow() {
    win = new BrowserWindow({
        // options
    });
}
  1. 定义一个 main.js 模块,该模块导出用于处理渲染进程发送的 change-size 消息的函数。这个函数应该将 win.isMaximized() 的结果发送回渲染进程。 如下所示:
// main.js
module.exports.changeSize = function() {
    const isMaximized = win.isMaximized();
    if (isMaximized) {
        win.setFullScreen(true);
    } else {
        win.maximize();
    }
    return isMaximized;
};
  1. 在渲染进程中处理双击事件,像下面这样:
//渲染进程内的
class App extends React.Component {

    winSizeChange(){
        ipcRenderer.invoke('change-size').then((isMaximized) => {
            console.log(isMaximized);
        });
    }

    render() {
        return (
          <AppBase className="App" onDoubleClick={() => this.winSizeChange()}>
            <header className="App-header">
              <img src={logo} className="App-logo" alt="logo" />
              <InputComponent />
            </header>
          </AppBase>
        );
    }
}

在渲染进程中,你应该使用 IPC Rendererinvoke 方法跨进程调用 main.js 模块的 changeSize 函数,并传入 change-size 消息。

这样,你就可以在 main.js 模块中管理 BrowserWindow 对象的状态,并通过 IPC Renderer 向渲染进程提供状态信息。