首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >电子遥控器(关闭、最小化等)无法工作(无法读取未定义的属性“getCurrentWindow”)

电子遥控器(关闭、最小化等)无法工作(无法读取未定义的属性“getCurrentWindow”)
EN

Stack Overflow用户
提问于 2020-08-30 07:57:08
回答 4查看 9.4K关注 0票数 4

我试图添加关闭和最小化按钮在无框窗口在电子JS应用程序。但不管怎么说都没用。它也显示了“无法读取属性'getCurrentWindow‘的未定义”错误。这是我的代码:

代码语言:javascript
代码运行次数:0
运行
复制
const {remote} = require('electron');

document.getElementById('minimize').onclick = function() {
    var window = remote.getCurrentWindow();
    window.minimize();
}

document.getElementById('close').onclick = function() {
    var window = remote.getCurrentWindow();
    window.close();
}

我还在webPreferences中添加了main.js:{nodeIntegration: true}。

代码语言:javascript
代码运行次数:0
运行
复制
win = new BrowserWindow({width: 990, height: 660, title: "Okkhor52 Tools", show: false, resizable: false, frame: false, webPreferences: {nodeIntegration: true}});

请给我一个解决办法,我试图找到这个问题解决在许多地方,但我没有得到确切的解决办法。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-30 17:44:51

解决问题很容易。只需在webPreferences: {enableRemoteModule: true}中的BrowserWindow中添加main.js即可。

代码语言:javascript
代码运行次数:0
运行
复制
win = new BrowserWindow({
    width: 990, 
    height: 660,
    title: "Okkhor52 Tools", 
    resizable: false, 
    frame: false, 
    webPreferences: {
        nodeIntegration: true, 
        enableRemoteModule: true
    }
}); 

除了enableRemoteModule: true,您还需要在webPreference中添加nodeIntegration: true,否则如果您从其他人的javascript调用电子(如这个const {remote} = require('electron'); ),它将无法工作。

票数 17
EN

Stack Overflow用户

发布于 2020-10-13 20:15:13

如果您已经将enableRemoteModule设置为true,并且仍然存在此问题,那么很可能需要远程模块,或者需要一个需要它在中的的文件--主要进程,至少对我来说是这样。远程模块在主进程中不是必需的,仅用于渲染程序进程。

如果您需要或需要在主进程中使用require("electron").remote.getCurrentWindow()的另一个javascript文件,那么您将得到这个错误。

解决这一问题只需在主进程中不以任何方式包含该代码。

票数 3
EN

Stack Overflow用户

发布于 2021-09-14 15:38:54

根据的文章,我们根本不应该使用“远程”。更好的方法是通过发送消息与渲染器进行通信。

首先,您需要WindowNodeHandlers类来调用BrowserWindow最大化/非最大化操作并更新isMaximized标志:

代码语言:javascript
代码运行次数:0
运行
复制
class WindowNodeHandlers {
  ipcMain.on('maximize', () => {
    BrowserWindow.getFocusedWindow()?.maximize();
  });

  ipcMain.on('unmaximize', () => {
    BrowserWindow.getFocusedWindow()?.unmaximize();
  });

  ipcMain.on('isMaximized', (event) => {
    event.returnValue = BrowserWindow.getFocusedWindow()?.isMaximized();
  });
}

然后创建ElectronWindowApi类,在呈现程序和主要进程之间进行通信:

代码语言:javascript
代码运行次数:0
运行
复制
class ElectronWindowApi implements MainWindowApi {
  maximize(): void {
   ipcRenderer.send('maximize');
  }

  unmaximize(): void {
   ipcRenderer.send('unmaximize');
  }

  isMaximized(): boolean {
   return ipcRenderer.sendSync('isMaximized') as boolean;
  }
 }

之后,在您的WindowNodeHandlers函数中创建createWindow实例并为这些事件添加侦听器,这些事件将将消息发送回呈现程序进程:

代码语言:javascript
代码运行次数:0
运行
复制
const createWindow = async () => {
 ...
 new WindowNodeHandlers();

 mainWindow.on('maximize', () =>
   mainWindow?.webContents.send('window-maximized')
 );

 mainWindow.on('unmaximize', () =>
   mainWindow?.webContents.send('window-unmaximized')
 );
}

最后要做的事情是为这些消息添加处理程序,并使用ElectronWindowApi调用呈现程序端的最大化/非最大化操作:

代码语言:javascript
代码运行次数:0
运行
复制
...
const windowApi = new ElectronWindowApi();
const [isMaximized, setIsMaximized] = useState(windowApi.isMaximized());
const onMaximized = () => setIsMaximized(true);
const onRestore = () => setIsMaximized(false);

const toggleMaximize = () => {
  isMaximized ? windowApi.unmaximize() : windowApi.maximize();
};

useEffect(() => {
  ipcRenderer.on('window-maximized', onMaximized);
  ipcRenderer.on('window-unmaximized', onRestore);
}, []);

return (
   <IconButton
      aria-label={isMaximized ? 'minimize' : 'maximize'}
      onClick={toggleMaximize}
    >
      {isMaximized ? (
        <SvgIcon
          component={MinimizeWindowIcon}
        />
      ) : (
        <SvgIcon
          component={MaximizeWindowIcon}
        />
      )}
    </IconButton>
)
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63655239

复制
相关文章

相似问题

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