123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import os from 'node:os';
- import path from 'node:path';
- import process from 'node:process';
- import { fileURLToPath } from 'node:url';
- import {
- app,
- BrowserWindow,
- globalShortcut,
- ipcMain,
- Menu,
- shell,
- } from 'electron';
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
- process.env.APP_ROOT = path.join(__dirname, '../..');
- export const MAIN_DIST = path.join(process.env.APP_ROOT, 'dist-electron');
- export const RENDERER_DIST = path.join(process.env.APP_ROOT, 'dist');
- export const VITE_DEV_SERVER_URL = process.env.VITE_DEV_SERVER_URL;
- process.env.VITE_PUBLIC = VITE_DEV_SERVER_URL
- ? path.join(process.env.APP_ROOT, 'public')
- : RENDERER_DIST;
- // Disable GPU Acceleration for Windows 7
- if (os.release().startsWith('6.1')) app.disableHardwareAcceleration();
- // Set application name for Windows 10+ notifications
- if (process.platform === 'win32') app.setAppUserModelId(app.getName());
- if (!app.requestSingleInstanceLock()) {
- app.quit();
- }
- let win: BrowserWindow | null = null;
- const preload = path.join(__dirname, '../preload/preload.mjs');
- const indexHtml = path.join(RENDERER_DIST, 'index.html');
- async function createWindow() {
- win = new BrowserWindow({
- autoHideMenuBar: true,
- frame: false,
- height: 900,
- icon: path.join(process.env.VITE_PUBLIC as string, 'favicon.ico'),
- movable: true,
- show: false,
- title: 'Main window',
- webPreferences: {
- contextIsolation: true,
- nodeIntegration: false,
- preload,
- webSecurity: true,
- },
- width: 1440,
- });
- // 监听窗口准备好显示的事件
- win.once('ready-to-show', () => {
- win?.maximize(); // 最大化窗口
- win?.show(); // 显示窗口
- });
- win.on('maximize', () => {
- win?.webContents.send('maximize-changed', true);
- });
- win.on('unmaximize', () => {
- win?.webContents.send('maximize-changed', false);
- });
- if (VITE_DEV_SERVER_URL) {
- win.loadURL(VITE_DEV_SERVER_URL);
- } else {
- win.loadFile(indexHtml);
- }
- // Test actively push message to the Electron-Renderer
- win.webContents.on('did-finish-load', () => {
- win?.webContents.send('main-process-message', new Date().toLocaleString());
- });
- // Make all links open with the browser, not with the application
- win.webContents.setWindowOpenHandler(({ url }) => {
- if (url.startsWith('https:')) shell.openExternal(url);
- return { action: 'deny' };
- });
- // win.webContents.on('will-navigate', (event, url) => { }) #344
- }
- Menu.setApplicationMenu(null);
- app
- .whenReady()
- .then(createWindow)
- .then(() => {
- // 禁用了菜单之后,默认的快捷键也会被禁用,这里重新注册部分常用快捷键
- if (VITE_DEV_SERVER_URL) {
- // 开发模式下监听快捷键来打开开发者工具
- globalShortcut.register('CmdOrCtrl+Shift+I', () => {
- BrowserWindow.getFocusedWindow()?.webContents.toggleDevTools();
- });
- }
- // 监听快捷键来刷新页面
- globalShortcut.registerAll(['CmdOrCtrl+R', 'CmdOrCtrl+F5'], () => {
- BrowserWindow.getFocusedWindow()?.webContents.reload();
- });
- // 监听快捷键来强制刷新页面
- globalShortcut.registerAll(
- ['CmdOrCtrl+Shift+R', 'CmdOrCtrl+Shift+F5'],
- () => {
- BrowserWindow.getFocusedWindow()?.webContents.reloadIgnoringCache();
- },
- );
- });
- app.on('window-all-closed', () => {
- win = null;
- if (process.platform !== 'darwin') app.quit();
- });
- app.on('will-quit', () => {
- globalShortcut.unregisterAll();
- });
- app.on('second-instance', () => {
- if (win) {
- // Focus on the main window if the user tried to open another
- if (win.isMinimized()) win.restore();
- win.focus();
- }
- });
- app.on('activate', () => {
- const allWindows = BrowserWindow.getAllWindows();
- if (allWindows.length > 0) {
- allWindows[0].focus();
- } else {
- createWindow();
- }
- });
- // New window example arg: new windows url
- ipcMain.handle('open-win', (_, arg) => {
- const childWindow = new BrowserWindow({
- frame: false,
- webPreferences: {
- contextIsolation: true,
- nodeIntegration: true,
- preload,
- webviewTag: true,
- },
- });
- if (VITE_DEV_SERVER_URL) {
- childWindow.loadURL(`${VITE_DEV_SERVER_URL}#${arg}`);
- } else {
- childWindow.loadFile(indexHtml, { hash: arg });
- }
- });
- ipcMain.handle('app-minimize', (event) => {
- const browserWindow = BrowserWindow.fromWebContents(event.sender);
- if (browserWindow) {
- browserWindow.minimize();
- }
- });
- ipcMain.handle('app-maximize', (event) => {
- const browserWindow = BrowserWindow.fromWebContents(event.sender);
- if (browserWindow) {
- if (browserWindow.isMaximized()) {
- browserWindow.restore();
- } else {
- browserWindow.maximize();
- }
- }
- });
- ipcMain.handle('app-close', (event) => {
- const browserWindow = BrowserWindow.fromWebContents(event.sender);
- if (browserWindow) {
- browserWindow.close();
- }
- });
- ipcMain.handle('is-maximized', (event) => {
- const browserWindow = BrowserWindow.fromWebContents(event.sender);
- if (browserWindow) {
- return browserWindow.isMaximized();
- }
- return false;
- });
|