通信这块,你查找资料会有很多,但是,都是一块一块的,只有自己亲自动手,你才会遇到各种问题。
在这里,我将个人研究运行后的路径发布如下,旨在能帮助更多的人节约时间。里面的各个字段的意义,百度查一下即可了解。
1.index.js
/*
* @Author: xhd
* @Date: 2024-10-19 17:39:24
* @FilePath: \dmyxToWin\index.js
* @LastEditTime: 2024-10-20 13:58:15
* @Description: Do not edit
*/
// app模块控制应用程序的事件生命周期。
// BrowserWindow模块创建和管理应用程序窗口。
const { app, BrowserWindow, ipcMain } = require("electron");
const path = require("path"); // 添加这行
// 保持一个对于 window 对象的全局引用,如果你不这样做,
let mainWindow;
/** 创建窗口 */
const createWindow = () => {
mainWindow = new BrowserWindow({
width: 1920,
height: 1080,
autoHideMenuBar: true,
resizable: false, // true缩放 false不能缩放
title: "游戏名称",
minimizable: false, // 窗口是否可以最小化
maximizable: false, // 窗口是否可以最大化
webPreferences: {
nodeIntegration: false, // 改为 false
contextIsolation: true, // 改为 true
preload: path.join(__dirname, "preload.js"),
},
});
// 加载 index.html
mainWindow.loadFile("web-mobile/index.html");
mainWindow.on("close", (e) => {
e.preventDefault();
if (mainWindow && mainWindow.webContents) {
console.log("Attempting to send app-close event to renderer");
mainWindow.webContents.send("app-close");
console.log("Sent app-close event to renderer");
// 添加一个超时,给渲染进程一些时间来响应
setTimeout(() => {
console.log("Timeout reached, forcing app to quit");
mainWindow.destroy();
app.quit();
}, 2000); // 5秒后强制退出
} else {
console.log("mainWindow or webContents is not available");
app.quit();
}
});
// 添加这个监听器来查看是否收到了 quit-app 消息
ipcMain.on("quit-app", () => {
console.log("Received quit-app event from renderer");
if (mainWindow) {
mainWindow.destroy();
}
app.quit();
});
// 添加这行来打开开发者工具
mainWindow.webContents.openDevTools();
};
// 这段程序将会在 Electron 结束初始化和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(createWindow);
// 当所有窗口都被关闭的时候退出程序。
app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
});
app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
2.preload.js
/*
* @Author: xhd
* @Date: 2024-10-20 10:08:01
* @FilePath: \dmyxToWin\preload.js
* @LastEditTime: 2024-10-20 13:54:24
* @Description: Do not edit
*/
const { contextBridge, ipcRenderer } = require("electron");
console.log("Preload script is running");
contextBridge.exposeInMainWorld("electron", {
onAppClose: (callback) => {
console.log("Setting up onAppClose listener");
ipcRenderer.on("app-close", (...args) => {
console.log("Received app-close event in preload", args);
callback(...args);
});
},
quitApp: () => {
console.log("Calling quitApp from preload");
ipcRenderer.send("quit-app");
},
});
console.log("Electron API exposed to renderer");
3.写一个bat方便一键执行,内容为
cnpm run-script package
4.提交git,更加.gitignore排除掉不需要提交的内容
/web-mobile/
/debug/
/release/
npm-debug.log
*.log
.DS_Store
/node_modules/
/*/node_modules/
5.cocos要监听消息
window['electron'].onAppClose((event) => {
console.log('Received app-close event in Cocos');
App.log.logBusiness('退出游戏', event);
// 执行您的清理操作
// to do exit
// 清理完成后,通知 Electron 可以退出了
console.log('Cocos cleanup done, sending quit-app event');
window['electron'].quitApp();
});
5.说下我这里实现的内容,点击关闭窗口,通知cocos做退出操作。