我试图添加关闭和最小化按钮在无框窗口在电子JS应用程序。但不管怎么说都没用。它也显示了“无法读取属性'getCurrentWindow‘的未定义”错误。这是我的代码:
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}。
win = new BrowserWindow({width: 990, height: 660, title: "Okkhor52 Tools", show: false, resizable: false, frame: false, webPreferences: {nodeIntegration: true}});
请给我一个解决办法,我试图找到这个问题解决在许多地方,但我没有得到确切的解决办法。
发布于 2020-08-30 09:44:51
解决问题很容易。只需在webPreferences: {enableRemoteModule: true}
中的BrowserWindow中添加main.js即可。
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');
),它将无法工作。
发布于 2020-10-13 12:15:13
如果您已经将enableRemoteModule
设置为true,并且仍然存在此问题,那么很可能需要远程模块,或者需要一个需要它在中的的文件--主要进程,至少对我来说是这样。远程模块在主进程中不是必需的,仅用于渲染程序进程。
如果您需要或需要在主进程中使用require("electron").remote.getCurrentWindow()
的另一个javascript文件,那么您将得到这个错误。
解决这一问题只需在主进程中不以任何方式包含该代码。
发布于 2021-09-14 07:38:54
根据这的文章,我们根本不应该使用“远程”。更好的方法是通过发送消息与渲染器进行通信。
首先,您需要WindowNodeHandlers类来调用BrowserWindow最大化/非最大化操作并更新isMaximized标志:
class WindowNodeHandlers {
ipcMain.on('maximize', () => {
BrowserWindow.getFocusedWindow()?.maximize();
});
ipcMain.on('unmaximize', () => {
BrowserWindow.getFocusedWindow()?.unmaximize();
});
ipcMain.on('isMaximized', (event) => {
event.returnValue = BrowserWindow.getFocusedWindow()?.isMaximized();
});
}
然后创建ElectronWindowApi类,在呈现程序和主要进程之间进行通信:
class ElectronWindowApi implements MainWindowApi {
maximize(): void {
ipcRenderer.send('maximize');
}
unmaximize(): void {
ipcRenderer.send('unmaximize');
}
isMaximized(): boolean {
return ipcRenderer.sendSync('isMaximized') as boolean;
}
}
之后,在您的WindowNodeHandlers函数中创建createWindow实例并为这些事件添加侦听器,这些事件将将消息发送回呈现程序进程:
const createWindow = async () => {
...
new WindowNodeHandlers();
mainWindow.on('maximize', () =>
mainWindow?.webContents.send('window-maximized')
);
mainWindow.on('unmaximize', () =>
mainWindow?.webContents.send('window-unmaximized')
);
}
最后要做的事情是为这些消息添加处理程序,并使用ElectronWindowApi调用呈现程序端的最大化/非最大化操作:
...
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>
)
...
https://stackoverflow.com/questions/63655239
复制相似问题