首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电子IPCMain不能访问变量

电子IPCMain不能访问变量
EN

Stack Overflow用户
提问于 2020-08-26 17:55:51
回答 1查看 596关注 0票数 0

我有一个带有main.js文件的电子应用程序,它是用一种更oo格式编写的。当我从呈现过程发送请求时,它就会到达。问题是,当它试图为一个对象调用一个方法时,它声明该对象是未定义的。

代码语言:javascript
复制
const { app, BrowserWindow, Menu, shell, dialog, session, ipcMain, webContents } = require('electron')

class GUI extends BrowserWindow {
    /**
     * Generates a window
     * @param {number} width - The initial width of the window. Default 800
     * @param {number} height - The initial height of the window. Default 600
     * @param {number} minWidth - The minimum width the window can possibly be. Default 800
     * @param {number} minHeight - The minimum height the window can possibly be. Default 600
     * @param {string} backgroundColor - The background colour of the window. Default #FFF
     * @param {string} icon - The path to the icon. Default null
     * @param {string} indexFile - The path to the index file to be loaded. Default null
     * @param {Electron.Menu} menu - The menu that should be displayed. Default null
     */
    constructor(width = 800, height = 600, minWidth = 800, minHeight = 600, backgroundColor = '#FFF', icon = null, indexFile = null, menu = null){
        super({
            width: width,
            height: height,
            minWidth: minWidth,
            minHeight: minHeight,
            icon: icon,
            backgroundColor: backgroundColor,
            frame: false,
            webPreferences: {
                nodeIntegration: true,
                enableRemoteModule: true
            }
        })
        this.fullscreen = false
        this.loadFile(indexFile)
        this.webContents.openDevTools()
        Menu.setApplicationMenu(menu)
        
        
        
    }//Constructor
    closeWin(){
        if(this.webContents.isDevToolsOpened == true){
            this.webContents.closeDevTools()
        }
        this.close()
    }//Close
    minimizeWin(){
        this.minimize()
    }
}

//Called when electron has finished initialising
app.on('ready', () => {
    let mainWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png', 'index.html')
})
//Quit when all windows are closed except on macOS
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin'){
        app.quit()
    }
})
ipcMain.on('windowControl', (event, arg) => {
    console.log(arg)
    // var request = JSON.parse(arg)
    var request = arg
    console.log(request)
    console.log(request.window)
    if (request.window == 'mainWindow'){
        if (request.func == 'openPreferences') {
            let preferencesWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
        }
        if (request.func == 'close'){
            mainWindow.closeWin()
        }
        if (request.func == 'min'){
            mainWindow.minimizeWin()
        }
        
    } 
    if (request.window == 'app' && request.func == 'exit' && process.platform !== 'darwin'){
        app.quit()
    }
})

单击“关闭”按钮时遇到的错误:

代码语言:javascript
复制
 A JavaScript error occurred in the main process
Uncaught Exception: iN
ReferenceError: mainWindow is not defined
at IpcMainImpl.<anonymous>
(C:\Users\computronics\source\repos\DC-Model-Railway-Controller\source\desktop
client\main,js:111:13)
at IpcMainImpl.emit (events.js:223:5)
at WebContents.< anonymous> (electron/js2c/browser_init.js:173:8161)
at WebContents.emit (events.js:223:5)

我的目标是从呈现过程向主进程发送请求,并执行这些请求。这些请求包括创建和关闭窗口。最小化窗口和其他请求。

从呈现过程发送的示例消息:

代码语言:javascript
复制
{window:'mainWindow', func:'close'}

其他信息

代码语言:javascript
复制
Nodejs: 12.14.1
Chrome: 83.0.4103.122
Electron: 9,1.2
V8: 8,3.110,13-electron.0
OS: Windows_NT x64 10,.0.18362

如有任何帮助,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-26 18:04:58

代码语言:javascript
复制
app.on('ready', () => {
    let mainWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png', 'index.html')
})

在匿名侦听器函数中定义变量mainWindow。尝试将变量设置为全局变量,如下所示:

代码语言:javascript
复制
var mainWindow;
app.on('ready', () => {
    mainWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png', 'index.html')
})

另一种可能的解决办法是:

代码语言:javascript
复制
if (request.window == 'mainWindow'){
    if (request.func == 'openPreferences') {
        let preferencesWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
    }
    if (request.func == 'close'){
        mainWindow.closeWin()
    }
    if (request.func == 'min'){
        mainWindow.minimizeWin()
    }
        
}

mainWindow替换为request.window

代码语言:javascript
复制
if (request.window == 'mainWindow'){
        if (request.func == 'openPreferences') {
            let preferencesWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
        }
        if (request.func == 'close'){
            request.window.closeWin()
        }
        if (request.func == 'min'){
            request.window.minimizeWin()
        }
            
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63603225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档