preload.ts 5.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. // CDP 网络拦截
  44. enableNetworkIntercept: (webContentsId: number, patterns: Array<{match: string, key: string}>) =>
  45. ipcRenderer.invoke('enable-network-intercept', webContentsId, patterns),
  46. disableNetworkIntercept: (webContentsId: number) =>
  47. ipcRenderer.invoke('disable-network-intercept', webContentsId),
  48. updateNetworkPatterns: (webContentsId: number, patterns: Array<{match: string, key: string}>) =>
  49. ipcRenderer.invoke('update-network-patterns', webContentsId, patterns),
  50. onNetworkInterceptData: (callback: (data: { webContentsId: number; key: string; url: string; data: unknown }) => void) => {
  51. ipcRenderer.on('network-intercept-data', (_event: unknown, data: { webContentsId: number; key: string; url: string; data: unknown }) => callback(data));
  52. },
  53. removeNetworkInterceptListener: () => {
  54. ipcRenderer.removeAllListeners('network-intercept-data');
  55. },
  56. });
  57. // 类型声明
  58. declare global {
  59. interface Window {
  60. electronAPI: {
  61. getAppVersion: () => Promise<string>;
  62. getPlatform: () => Promise<string>;
  63. minimizeWindow: () => void;
  64. maximizeWindow: () => void;
  65. closeWindow: () => void;
  66. quitApp: () => void;
  67. isMaximized: () => Promise<boolean>;
  68. onMaximizedChange: (callback: (isMaximized: boolean) => void) => void;
  69. selectFile: (options?: { filters?: { name: string; extensions: string[] }[] }) => Promise<string | null>;
  70. selectFolder: () => Promise<string | null>;
  71. showNotification: (title: string, body: string) => void;
  72. getWebviewCookies: (partition: string, url: string) => Promise<Electron.Cookie[]>;
  73. clearWebviewCookies: (partition: string) => Promise<boolean>;
  74. setWebviewCookies: (partition: string, cookies: Electron.CookiesSetDetails[]) => Promise<boolean>;
  75. captureWebviewPage: (webContentsId: number) => Promise<string | null>;
  76. webviewSendMouseClick: (webContentsId: number, x: number, y: number) => Promise<boolean>;
  77. webviewSendTextInput: (webContentsId: number, text: string) => Promise<boolean>;
  78. webviewGetElementPosition: (webContentsId: number, selector: string) => Promise<{ x: number; y: number; width: number; height: number } | null>;
  79. webviewClickByText: (webContentsId: number, text: string) => Promise<boolean>;
  80. // CDP 网络拦截
  81. enableNetworkIntercept: (webContentsId: number, patterns: Array<{match: string, key: string}>) => Promise<boolean>;
  82. disableNetworkIntercept: (webContentsId: number) => Promise<boolean>;
  83. updateNetworkPatterns: (webContentsId: number, patterns: Array<{match: string, key: string}>) => Promise<boolean>;
  84. onNetworkInterceptData: (callback: (data: { webContentsId: number; key: string; url: string; data: unknown }) => void) => void;
  85. removeNetworkInterceptListener: () => void;
  86. };
  87. }
  88. }