KiaClouth 2020-10-14 19:07 采纳率: 0%
浏览 230

求教为什么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
再也不会变回去,不知道是为什么。。。
大佬们帮忙看看啊_(:з」∠)_,感激不尽

  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-16 19:33
    关注

    参考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 向渲染进程提供状态信息。

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable