这几天在写ai提权程序时候用到了它,使用它的原因是它的框架和github pages等结构相似,本想着不用做太多更改,但还是遇到了很多问题,现在勉强能跑起来,在做更多更改之前,先做一下记录。
框架结构:
- main.js:主进程,负责创建浏览器窗口、管理事件、监听系统事件等。
- index.html:渲染进程的入口文件,负责渲染页面。
- package.json:项目配置文件,用于管理项目依赖。
- renderer.js:渲染进程,负责渲染页面。
- preload.js:渲染进程的预加载脚本,负责在渲染进程加载页面之前加载资源。
进程间的通信:
不同进程负责不同的工作,有些操作单独进程不能完成,比如electron限制main不能操作渲染进程的dom,而renderer不能使用fs的api,所以需要进程间通信。
举例
// 主进程
const { BrowserWindow } = require('electron')
let win ;
win.webContents.on('did-finish-load', () => {//页面加载完成例
win.webContents.send('message', 'Hello from main process')
})
// 渲染进程
const { ipcRenderer } = require('electron')
ipcRenderer.on('message', (event, message) => {
console.log(message)//打印接收的消息
})
参数传递的数量并不限制,但是接收要在event之后依次排列,按顺序接收。
通信的回应:
......
ipcRenderer.on('message', (event, message) => {
console.log(message)//打印接收的消息
event.sender.send('reply', 'Hello from renderer process')//回应消息
})
// 主进程
ipcRenderer.on('reply', (event, message) => {
console.log(message)//打印回应的消息
})
或者
......
ipcRenderer.on('message', (event, message) => {
console.log(message)//打印接收的消息
event.reply('reply', 'Hello from renderer process')//回应消息
})
// 主进程
ipcRenderer.on('reply', (event, message) => {
console.log(message)//打印回应的消息
})
事件管理:
app:控制应用程序的生命周期。
- app.quit():退出应用程序。 - app.exit():退出应用程序。 - app.on('ready', function() {}):应用程序准备就绪。 - app.on('window-all-closed', function() {}):所有窗口都关闭。 - app.on('activate', function() {}):应用程序激活。 - app.getPath(name):获取应用程序的路径。 - app.setPath(name, path):设置应用程序的路径。 - app.isReady():判断应用程序是否准备就绪。globalShortcut:注册全局快捷键。
- globalShortcut.register(accelerator, function() {}):注册快捷键。 - globalShortcut.unregister(accelerator):注销快捷键。 - globalShortcut.isRegistered(accelerator):判断快捷键是否注册。BrowserWindow:创建浏览器窗口的接口。
- BrowserWindow.loadURL(url):加载页面。 - BrowserWindow.webContents.on('did-finish-load', function() {}):页面加载完成。 - BrowserWindow.webContents.send(channel, ...args):向渲染进程发送消息。 - BrowserWindow.webContents.on(channel, function(event, ...args) {}):渲染进程接收消息。 - BrowserWindow.on('closed', function() {}):窗口关闭。常用模块:
一些程序运行依赖模块(当然是不需要记内容的,只需要知道有这么个东西,能干怎么样的事):
fs:用于读写文件。
fs.readFile(path, options, function(err, data) {}):读取文件。 fs.writeFile(path, data, options, function(err) {}):写入文件。 fs.mkdir(path, options, function(err) {}):创建目录。 fs.rmdir(path, options, function(err) {}):删除目录。 fs.readdir(path, options, function(err, files) {}):读取目录。 fs.stat(path, options, function(err, stats) {}):获取文件或目录的状态。 fs.rename(oldPath, newPath, function(err) {}):重命名文件或目录。 fs.unlink(path, function(err) {}):删除文件。 fs.fstat(fd, function(err, stats) {}):获取文件描述符的状态。 fs.close(fd, function(err) {}):关闭文件描述符。 fs.open(path, flags, mode, function(err, fd) {}):打开文件。 fs.read(fd, buffer, offset, length, position, function(err, bytesRead, buffer) {}):读取文件。 fs.write(fd, buffer, offset, length, position, function(err, bytesWritten, buffer) {}):写入文件。 fs.createReadStream(path, options):创建读取流。 fs.createWriteStream(path, options):创建写入流。os:用于获取系统信息。
os.userInfo(options, function(err, userInfo) {}):获取用户信息。 os.homedir():获取用户目录。 os.tmpdir():获取临时目录。 os.platform():获取操作系统平台。 os.release():获取操作系统版本。 os.type():获取操作系统类型。 os.arch():获取操作系统架构。 os.cpus():获取CPU信息。 os.networkInterfaces():获取网络接口信息。path:用于处理文件路径。
path.join(path1, path2, ...):拼接路径。 path.resolve(path):解析路径。 path.dirname(path):获取目录。 path.basename(path):获取文件名。 path.extname(path):获取扩展名。child_process:用于创建子进程。
child_process.exec(command, options, function(err, stdout, stderr) {}):执行命令。 child_process.execFile(file, args, options, function(err, stdout, stderr) {}):执行文件。 child_process.fork(modulePath, args, options):创建子进程。 child_process.spawn(command, args, options):创建子进程。dialog:用于创建对话框。
dialog.showOpenDialog(options, function(filePaths) {}):打开文件对话框。 dialog.showSaveDialog(options, function(filePath) {}):保存文件对话框。 dialog.showMessageBox(options, function(response) {}):创建消息框。shell:用于打开文件、文件夹等。
shell.openItem(path):打开文件或文件夹。 shell.openExternal(url):打开外部链接。Menu:用于创建菜单。
Menu.buildFromTemplate(template):创建菜单。 Menu.setApplicationMenu(menu):设置菜单。Tray:用于创建托盘图标。
Tray.setToolTip(toolTip):设置托盘图标提示信息。 Tray.setContextMenu(contextMenu):设置托盘图标右键菜单。 Tray.setImage(image):设置托盘图标图像。 Tray.destroy():销毁托盘图标。powerMonitor:用于监听电源状态变化。
powerMonitor.on('suspend', function() {}):系统进入休眠状态。 powerMonitor.on('resume', function() {}):系统恢复运行状态。 powerMonitor.on('on-ac', function() {}):系统进入AC状态。 powerMonitor.on('on-battery', function() {}):系统进入电池状态。screen:用于获取屏幕信息。
screen.getPrimaryDisplay():获取主屏幕信息。 screen.getAllDisplays():获取所有屏幕信息。 screen.on('display-added', function(event, display) {}):屏幕增加。 screen.on('display-removed', function(event, display) {}):屏幕移除。 screen.on('display-metrics-changed', function(event, display, changedMetrics) {}):屏幕信息变化。webFrame:用于控制渲染进程的页面。
webFrame.setZoomFactor(factor):设置缩放比例。 webFrame.setZoomLevel(level):设置缩放级别。 webFrame.setZoomLevelLimits(minimumLevel, maximumLevel):设置缩放级别限制。 webFrame.setLayoutZoomLevelLimits(minimumLevel, maximumLevel):设置布局缩放级别限制。 webFrame.setVisualZoomLevelLimits(minimumLevel, maximumLevel):设置视觉缩放级别限制。autoUpdater:用于自动更新。
打包
使用electron-builder打包:
- 安装electron-builder:
npm install electron-builder --save-dev
- 在package.json中添加build脚本:
"build": "electron-builder"
- 运行
npm run build
命令,打包程序。
使用electron forge打包:
npm install –save-dev @electron-forge/cli
npx electron-forge import
npm run make
官方打包教程:
https://www.electronjs.org/zh/docs/latest/tutorial/%E6%89%93%E5%8C%85%E6%95%99%E7%A8%8B
打包后的exe文件是安装文件,要找到安装到哪里了,不用每次都点击安装。
此方悬停