window.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import type {BrowserWindowConstructorOptions} from 'electron';
  2. import {BrowserWindow, dialog} from 'electron';
  3. import path from 'path';
  4. import {_PATHS} from '../paths';
  5. import {$env, isDev} from '../env';
  6. import {createTray} from './tray';
  7. // 创建窗口
  8. export function createBrowserWindow(options?: BrowserWindowConstructorOptions) {
  9. const win = new BrowserWindow({
  10. width: 1200,
  11. height: 800,
  12. webPreferences: {
  13. preload: path.join(_PATHS.preloadRoot, 'index.js'),
  14. nodeIntegration: false,
  15. contextIsolation: true,
  16. },
  17. // 应用图标
  18. icon: isDev ? _PATHS.appIcon : void 0,
  19. ...options,
  20. });
  21. // 设置窗口打开处理器
  22. win.webContents.setWindowOpenHandler(({url}) => {
  23. const win = createBrowserWindow();
  24. win.loadURL(url);
  25. // 阻止创建新窗口,因为已经被接管
  26. return {action: 'deny'};
  27. });
  28. // 当 beforeunload 阻止窗口关闭时触发
  29. win.webContents.on('will-prevent-unload', () => {
  30. const choice = dialog.showMessageBoxSync(win, {
  31. type: 'question',
  32. title: '确认关闭吗?',
  33. message: '系统可能不会保存您所做的更改。',
  34. buttons: ['关闭', '取消'],
  35. defaultId: 1,
  36. cancelId: 1,
  37. noLink: true,
  38. });
  39. // 用户选择了关闭,直接销毁窗口
  40. if (choice === 0) {
  41. win.destroy();
  42. }
  43. });
  44. return win;
  45. }
  46. // 创建主窗口、系统托盘
  47. export function createMainWindow() {
  48. const win = createIndexWindow()
  49. // 设置系统托盘图标
  50. createTray(win);
  51. // 主窗口尝试关闭时,默认不直接退出应用,而是隐藏到托盘
  52. win.on('close', (event) => {
  53. event.preventDefault();
  54. win.hide();
  55. });
  56. return win;
  57. }
  58. // 创建索引窗口
  59. export function createIndexWindow() {
  60. const win = createBrowserWindow({
  61. width: 1600,
  62. height: 1000,
  63. title: $env.VITE_GLOB_APP_TITLE!,
  64. });
  65. // 开发环境加载Vite服务,生产加载打包文件
  66. if (isDev) {
  67. win.loadURL($env.VITE_DEV_SERVER_URL!)
  68. // 开发环境下,自动打开调试工具
  69. // win.webContents.openDevTools()
  70. } else {
  71. win.loadFile(path.join(_PATHS.publicRoot, 'index.html'));
  72. }
  73. return win;
  74. }