javascript
const { app, BrowserWindow } = require('electron');
function createWindow() {
const mainWindow = new BrowserWindow({
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') {
const isCopy = (input.key === 'c' || input.key === 'C') && (input.control || input.meta);
const isPaste = (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
- 右键复制
- 选择文本
- 拖拽文本
- 检查控制台输出是否有错误或阻止日志。