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. 检查控制台输出是否有错误或阻止日志。
相关推荐
Q一件事2 小时前
ArcGIS中TypeError: can‘t multiply sequence by non-int of type ‘str‘错误
前端·javascript·arcgis
美狐美颜SDK开放平台3 小时前
从视频处理到实时渲染:直播APP中视频美颜SDK的关键技术解析
前端·人工智能·架构·实时互动·音视频·视频美颜sdk
WeiXin_DZbishe3 小时前
基于springboot大学生提问箱系统-计算机毕设【课程设计】72593
javascript·vue.js·spring boot·vscode·python·node.js·php
yume_sibai3 小时前
ES6 核心知识点完全总结(变量 + 箭头函数 + 解构 + Promise + 模块化)
前端·ecmascript·es6
Moment3 小时前
为什么市面上的 coding agent 大多数都基于Nodejs?
前端·后端·面试
吃瓜的猹3 小时前
Gemini 3.8 Flash 是真的站起来了,一起来看看我到底做了什么吧~
前端
光影少年3 小时前
React18 对RN 的影响
android·前端·react.js·ios·前端框架
tryCbest3 小时前
Vue Router学习及使用
前端·vue.js
杉氧3 小时前
丝滑的奥秘:Reanimated 3 动画引擎与手势处理(Gesture Handler)
android·前端·react native
用户970161501684 小时前
浏览器切到后台后,AI 给我的代码就失效了:我拿 3 个模型测了 6 个定时器坑
前端·代码规范