mainWin.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import { BrowserWindow, ipcMain, screen } from "electron";
  2. import { join } from "node:path";
  3. import { ICON, DIST, preload, url } from "../main/utils";
  4. import log from "electron-log/main";
  5. const NODE_ENV = process.env.NODE_ENV;
  6. const indexHtml = join(DIST, "./index.html");
  7. let mainWindow: BrowserWindow | null;
  8. const extra = {
  9. activeClose: false,
  10. };
  11. // 主窗口
  12. const createWindow = (): BrowserWindow => {
  13. //动态适应宽高
  14. const { width } = screen.getPrimaryDisplay().workAreaSize;
  15. // 设置窗口的宽度和高度
  16. const winWidth = 420;
  17. const winHeight = 700;
  18. // 计算窗口在右上角的位置
  19. const x = width - winWidth;
  20. const y = 10;
  21. // 创建浏览器窗口
  22. mainWindow = new BrowserWindow({
  23. title: "菁苗健康",
  24. icon: ICON,
  25. x,
  26. y,
  27. width: winWidth,
  28. height: winHeight,
  29. frame: false,
  30. show: false,
  31. // transparent: true,
  32. alwaysOnTop: true, // 始终在顶部
  33. backgroundColor: "#fff",
  34. webPreferences: {
  35. preload,
  36. webviewTag: true, // 启用webview标签
  37. // webSecurity: false,
  38. },
  39. });
  40. ipcMain.handle("get-window-info", async (event) => {
  41. const [width] = mainWindow?.getSize() || [0, 0]; // 获取当前窗口宽度
  42. const display = screen.getPrimaryDisplay();
  43. const scaleFactor = display.scaleFactor; // 缩放因子,例如 1.5
  44. return { width, scaleFactor }; // 返回宽度值
  45. });
  46. mainWindow.setMenu(null); // 去掉顶部菜单
  47. // log.info("Log from the main process");
  48. // const args = process.argv.slice(2); // 去掉前两个默认参数(node 和 script 路径)
  49. // console.log("args==>", args); // 输出实际传递的参数
  50. if (url) {
  51. mainWindow.loadURL(url);
  52. } else {
  53. mainWindow.loadFile(indexHtml);
  54. }
  55. // mainWindow.webContents.openDevTools();
  56. // mainWindow.on("closed", () => {
  57. // mainWindow = null;
  58. // });
  59. mainWindow.once("ready-to-show", () => {
  60. log.info("启动参数process.argv==> hidden表示开机重启成功", process.argv);
  61. if (process.argv.indexOf("--hidden") < 0) {
  62. showMainWin();
  63. }
  64. });
  65. // 监听窗口的关闭事件
  66. mainWindow.on("close", (e) => {
  67. if (!extra.activeClose) {
  68. e.preventDefault();
  69. hideMainWin();
  70. } else {
  71. extra.activeClose = true;
  72. }
  73. });
  74. return mainWindow;
  75. };
  76. // 关闭窗口
  77. function closeMainWin() {
  78. if (mainWindow?.isDestroyed()) {
  79. mainWindow!.close();
  80. }
  81. mainWindow = null;
  82. }
  83. // 打开窗口
  84. function openMainWin() {
  85. mainWindow = createWindow();
  86. mainWindow!.show();
  87. }
  88. // 显示窗口
  89. function showMainWin() {
  90. if (!mainWindow || mainWindow?.isDestroyed()) {
  91. mainWindow = createWindow();
  92. }
  93. mainWindow!.show();
  94. }
  95. // 隐藏窗口
  96. function hideMainWin() {
  97. mainWindow!.hide();
  98. // app.quit();
  99. }
  100. // 最小化窗口
  101. function minimizeMainWin() {
  102. mainWindow!.minimize();
  103. }
  104. // 最大化窗口
  105. function maximizeMainWin() {
  106. mainWindow!.maximize();
  107. }
  108. function middleMainWin() {
  109. if (mainWindow?.isMaximized()) {
  110. mainWindow.unmaximize();
  111. }
  112. const display = screen.getPrimaryDisplay();
  113. const { width } = display.workAreaSize; // 逻辑像素
  114. const scaleFactor = display.scaleFactor; // 缩放因子,例如 1.5
  115. let currentWidth = mainWindow?.getBounds().width || 0;
  116. const winSys = process.platform === "win32";
  117. const baseWidth = winSys ? 420 * scaleFactor : 420;
  118. if (currentWidth && currentWidth > baseWidth) {
  119. mainWindow?.setBounds({
  120. width: 420,
  121. x: width - 420,
  122. });
  123. return;
  124. }
  125. mainWindow?.setBounds({
  126. width: 840,
  127. x: width - 840,
  128. });
  129. }
  130. // 取消最大化窗口
  131. function unmaximizeMainWin() {
  132. mainWindow!.unmaximize();
  133. }
  134. // 是否最大化
  135. function isMaximized() {
  136. return mainWindow!.isMaximized();
  137. }
  138. function focusMainWin() {
  139. if (mainWindow) {
  140. // Focus on the main window if the user tried to open another
  141. if (mainWindow.isMinimized()) mainWindow.restore();
  142. mainWindow.focus();
  143. }
  144. }
  145. export {
  146. mainWindow,
  147. extra,
  148. createWindow,
  149. closeMainWin,
  150. openMainWin,
  151. hideMainWin,
  152. showMainWin,
  153. focusMainWin,
  154. minimizeMainWin,
  155. isMaximized,
  156. maximizeMainWin,
  157. unmaximizeMainWin,
  158. middleMainWin,
  159. };