const{app,BrowserWindow}=require('electron');functioncreateWindow(){constmainWindow=newBrowserWindow({width:800,height:600,webPreferences:{nodeIntegration:false,contextIsolation:true,sandbox:true,// 增强安全性webSecurity:true// 确保远程内容的安全性}});// 加载远程网站mainWindow.loadURL('https://example.com').catch(err=>{console.error('Failed to load URL:',err);});// 方法1: 拦截键盘复制快捷键mainWindow.webContents.on('before-input-event',(event,input)=>{if(input.type==='keyDown'){constisCopy=(input.key==='c'||input.key==='C')&&(input.control||input.meta);constisPaste=(input.key==='v'||input.key==='V')&&(input.control||input.meta);if(isCopy||isPaste){console.log('Blocked copy/paste attempt');event.preventDefault();}}});// 方法2: 禁用右键菜单mainWindow.webContents.on('context-menu',(e,props)=>{e.preventDefault();});// 方法3: 当页面加载完成后注入保护措施mainWindow.webContents.on('did-finish-load',()=>{mainWindow.webContents.executeJavaScript(`// 禁用选择 document.body.style.cssText += '-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;'; // 拦截复制事件 document.addEventListener('copy', (e) => { e.preventDefault(); e.clipboardData.setData('text/plain', ''); return false; }, true); // 拦截选择开始 document.addEventListener('selectstart', (e) => { e.preventDefault(); return false; }, true); // 禁用拖拽 document.addEventListener('dragstart', (e) => { e.preventDefault(); return false; }, true);`).catch(err=>{console.error('JavaScript injection failed:',err);});});// 方法4: 监控开发者工具(可选)mainWindow.webContents.on('devtools-opened',()=>{console.log('DevTools opened - might bypass protections');});}app.whenReady().then(()=>{createWindow();app.on('activate',()=>{if(BrowserWindow.getAllWindows().length===0)createWindow();});});app.on('window-all-closed',()=>{if(process.platform!=='darwin')app.quit();});针对你的环境优化后的特点:
Electron 34.3.0 兼容性:
- 这个版本是较新的,支持所有提到的 API。
- 使用了
did-finish-load替代dom-ready,因为对于远程网站更可靠。
远程网站处理:
- 添加了错误处理,确保加载失败时有提示。
- 使用
executeJavaScript在页面加载后注入保护代码,因为直接的 CSS 注入可能被远程网站的 CSP 阻止。
全面的复制防护:
- 阻止键盘快捷键(Ctrl+C / Command+C)
- 禁用右键菜单
- 禁止文本选择
- 清空剪贴板数据
- 阻止拖拽复制
可能的限制和解决方法:
CSP(内容安全策略):
- 如果远程网站启用了严格的 CSP,
executeJavaScript可能失败。 - 解决:将远程内容加载到本地代理,或联系网站管理员调整 CSP。
- 如果远程网站启用了严格的 CSP,
网站自身的 JavaScript:
- 远程网站可能覆盖我们的保护措施。
- 解决:使用更高的优先级事件监听(
true参数表示捕获阶段)。
用户绕过:
- 用户仍可通过截屏或开发者工具复制。
- 解决:无法完全阻止,但可以通过检测 DevTools 打开来警告。
测试步骤:
- 用你的实际远程 URL 替换
'https://example.com'。 - 运行应用(确保使用
electron-builder打包或直接用electron .)。 - 尝试:
- Ctrl+C / Command+C
- 右键复制
- 选择文本
- 拖拽文本
- 检查控制台输出是否有错误或阻止日志。