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. 检查控制台输出是否有错误或阻止日志。
相关推荐
Mr Xu_1 分钟前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝4 分钟前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions13 分钟前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发13 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_20 分钟前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞0521 分钟前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、26 分钟前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao26 分钟前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
杨超越luckly33 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
hedley(●'◡'●)1 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机