Electron 禁止复制粘帖

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();
});

针对你的环境优化后的特点:

  1. Electron 34.3.0 兼容性:

    • 这个版本是较新的,支持所有提到的 API。
    • 使用了 did-finish-load 替代 dom-ready,因为对于远程网站更可靠。
  2. 远程网站处理:

    • 添加了错误处理,确保加载失败时有提示。
    • 使用 executeJavaScript 在页面加载后注入保护代码,因为直接的 CSS 注入可能被远程网站的 CSP 阻止。
  3. 全面的复制防护:

    • 阻止键盘快捷键(Ctrl+C / Command+C)
    • 禁用右键菜单
    • 禁止文本选择
    • 清空剪贴板数据
    • 阻止拖拽复制

可能的限制和解决方法:

  1. CSP(内容安全策略):

    • 如果远程网站启用了严格的 CSP,executeJavaScript 可能失败。
    • 解决:将远程内容加载到本地代理,或联系网站管理员调整 CSP。
  2. 网站自身的 JavaScript:

    • 远程网站可能覆盖我们的保护措施。
    • 解决:使用更高的优先级事件监听(true 参数表示捕获阶段)。
  3. 用户绕过:

    • 用户仍可通过截屏或开发者工具复制。
    • 解决:无法完全阻止,但可以通过检测 DevTools 打开来警告。

测试步骤:

  1. 用你的实际远程 URL 替换 'https://example.com'。
  2. 运行应用(确保使用 electron-builder 打包或直接用 electron .)。
  3. 尝试:
    • Ctrl+C / Command+C
    • 右键复制
    • 选择文本
    • 拖拽文本
  4. 检查控制台输出是否有错误或阻止日志。
相关推荐
sycmancia14 小时前
Qml——Window元素使用
前端
每天都好困14 小时前
03 AR 投影与误差修正:把地图上的点贴到视频画面上
前端
每天都好困14 小时前
04 地图图层封装:像管理 Photoshop 图层一样管理地图元素
前端
去伪存真14 小时前
构建你的第一个 DevOps AI Agent:自动化捕获、分析并修复 CI 故障
前端·agent
niucloud-admin15 小时前
JAVA V6 多商户商城 开发文档——手机端前端
java·开发语言·前端
喵个咪15 小时前
GoWind Admin|风行 — 开箱即用的企业级全栈中后台框架:脚本系统实战
javascript·后端·go
樱花落木兰15 小时前
SpringBoot + ECharts 后台数据统计报表模块实战
java·javascript·spring boot·ai·log4j·github·echarts
skywalk816315 小时前
deepseekharness在对话中,有四种模式,分别是极简、PTC、创造和标准模式,每种模式下挂载的插件、skill等数量不一样
前端·人工智能·实践
愛芳芳15 小时前
element-plus+vite+vue3+pinpa+mock+typeScript搭建经典的电商管理后台
前端·javascript·typescript
liangshanbo121515 小时前
面试题:常见的前端构建工具有哪些?分别适用于什么场景?
前端