preload.ts 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // 使用 require 避免 ESM 问题
  2. const { contextBridge, ipcRenderer } = require('electron');
  3. // 暴露给渲染进程的 API
  4. contextBridge.exposeInMainWorld('electronAPI', {
  5. // 应用信息
  6. getAppVersion: () => ipcRenderer.invoke('get-app-version'),
  7. getPlatform: () => ipcRenderer.invoke('get-platform'),
  8. // 窗口控制
  9. minimizeWindow: () => ipcRenderer.send('window-minimize'),
  10. maximizeWindow: () => ipcRenderer.send('window-maximize'),
  11. closeWindow: () => ipcRenderer.send('window-close'),
  12. quitApp: () => ipcRenderer.send('app-quit'), // 真正退出应用
  13. isMaximized: () => ipcRenderer.invoke('window-is-maximized'),
  14. onMaximizedChange: (callback: (isMaximized: boolean) => void) => {
  15. ipcRenderer.on('window-maximized', (_event: unknown, isMaximized: boolean) => callback(isMaximized));
  16. },
  17. // 文件操作
  18. selectFile: (options?: { filters?: { name: string; extensions: string[] }[] }) =>
  19. ipcRenderer.invoke('select-file', options),
  20. selectFolder: () => ipcRenderer.invoke('select-folder'),
  21. // 通知
  22. showNotification: (title: string, body: string) =>
  23. ipcRenderer.send('show-notification', { title, body }),
  24. // Webview Cookie 操作
  25. getWebviewCookies: (partition: string, url: string) =>
  26. ipcRenderer.invoke('get-webview-cookies', partition, url),
  27. clearWebviewCookies: (partition: string) =>
  28. ipcRenderer.invoke('clear-webview-cookies', partition),
  29. setWebviewCookies: (partition: string, cookies: Electron.CookiesSetDetails[]) =>
  30. ipcRenderer.invoke('set-webview-cookies', partition, cookies),
  31. // Webview 截图(用于 AI 分析)
  32. captureWebviewPage: (webContentsId: number) =>
  33. ipcRenderer.invoke('capture-webview-page', webContentsId),
  34. // Webview 自动操作
  35. webviewSendMouseClick: (webContentsId: number, x: number, y: number) =>
  36. ipcRenderer.invoke('webview-send-mouse-click', webContentsId, x, y),
  37. webviewSendTextInput: (webContentsId: number, text: string) =>
  38. ipcRenderer.invoke('webview-send-text-input', webContentsId, text),
  39. webviewGetElementPosition: (webContentsId: number, selector: string) =>
  40. ipcRenderer.invoke('webview-get-element-position', webContentsId, selector),
  41. webviewClickByText: (webContentsId: number, text: string) =>
  42. ipcRenderer.invoke('webview-click-by-text', webContentsId, text),
  43. });
  44. // 类型声明
  45. declare global {
  46. interface Window {
  47. electronAPI: {
  48. getAppVersion: () => Promise<string>;
  49. getPlatform: () => Promise<string>;
  50. minimizeWindow: () => void;
  51. maximizeWindow: () => void;
  52. closeWindow: () => void;
  53. quitApp: () => void;
  54. isMaximized: () => Promise<boolean>;
  55. onMaximizedChange: (callback: (isMaximized: boolean) => void) => void;
  56. selectFile: (options?: { filters?: { name: string; extensions: string[] }[] }) => Promise<string | null>;
  57. selectFolder: () => Promise<string | null>;
  58. showNotification: (title: string, body: string) => void;
  59. getWebviewCookies: (partition: string, url: string) => Promise<Electron.Cookie[]>;
  60. clearWebviewCookies: (partition: string) => Promise<boolean>;
  61. setWebviewCookies: (partition: string, cookies: Electron.CookiesSetDetails[]) => Promise<boolean>;
  62. captureWebviewPage: (webContentsId: number) => Promise<string | null>;
  63. webviewSendMouseClick: (webContentsId: number, x: number, y: number) => Promise<boolean>;
  64. webviewSendTextInput: (webContentsId: number, text: string) => Promise<boolean>;
  65. webviewGetElementPosition: (webContentsId: number, selector: string) => Promise<{ x: number; y: number; width: number; height: number } | null>;
  66. webviewClickByText: (webContentsId: number, text: string) => Promise<boolean>;
  67. };
  68. }
  69. }