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. 检查控制台输出是否有错误或阻止日志。
相关推荐
左夕19 分钟前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
Zha0Zhun1 小时前
一个使用ViewBinding封装的Dialog
前端
兆子龙1 小时前
从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
前端
滕青山1 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力1 小时前
编程常用模式集合
前端·javascript·typescript
大雨还洅下1 小时前
前端JS: 跨域解决
javascript
恋猫de小郭1 小时前
Apple 的 ANE 被挖掘,AI 硬件公开,宣传的 38 TOPS 居然是"数字游戏"?
前端·人工智能·ios
小岛前端1 小时前
Node.js 宣布重大调整,运行十年的规则要改了!
前端·node.js
OpenTiny社区1 小时前
OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用
前端·javascript·ai编程
梦想CAD控件2 小时前
在线CAD开发包结构与功能说明
前端·javascript·vue.js