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. 检查控制台输出是否有错误或阻止日志。
相关推荐
@小张在努力2 小时前
Javascript中的闭包
开发语言·javascript·ecmascript
be or not to be2 小时前
CSS 文本样式与阴影整理笔记
前端·css·笔记
辛-夷2 小时前
js中如何改变this指向
开发语言·前端·javascript
门思科技2 小时前
基于 LoRaWAN 的 CJ/T 188 M-Bus 热量表采集方案解析:KC22 与 Edge-Bus 的工程化实践
前端·edge
捻tua馔...2 小时前
面试被问到-redux-toolkit用法
前端
qq_463408422 小时前
React Native跨平台技术在开源鸿蒙中使用内置的`fetch` API或者第三方库如`axHarmony`来处理网络通信HTTP请求
javascript·算法·react native·react.js·http·开源·harmonyos
IT_陈寒2 小时前
SpringBoot 3.0实战:5个高频踩坑点及性能优化方案,让你的应用吞吐量提升40%
前端·人工智能·后端
WebRuntime2 小时前
所有64位WinForm应用都是Chromium浏览器
javascript·c++·c#·.net·web
自由与自然2 小时前
flex布局常用用法
前端·css·css3