当前位置 博文首页 > kisshd的博客:那些玩electron遇到的坑和解决方案

    kisshd的博客:那些玩electron遇到的坑和解决方案

    作者:[db:作者] 时间:2021-07-13 10:11

    坑1_无框模式的窗口

    自带的和开关窗口好丑,作为一个设计师绝对忍不了,于是乎自接写了一个窗口,但是不巧在下只懂一点点的js,给我累的,于是在各种地方寻找可以使用的无框关闭,顶设,最大化,最小化的方法,但是因为这个被坑了好多次,好家伙大家提供的方式都有一个弊端,一但窗口关闭了就会导致无法关闭而报错,大家写的都是简单的方式的都是单窗口的,于是乎经过很多很多次摸爬滚打找到了方式
    //首先引入下需要使用到的函数
    let {ipcMain}= require('electron');
    //监听窗口关闭请求
      ipcMain.on('close_win', function (event, arg) {
        let win = BrowserWindow.fromId(event.sender.id);//其实这里可以使用三元运算符会代码量少点,但是要重新获取一次我觉得有点影响算力还不如创建临时变量
    	 //如果没有找到窗口对象或者固定的构造函数的话则重新获取id
    	 if (!win || !win.isMaximized) {
                 win = event.sender.getOwnerBrowserWindow();
                 if (!win) return event.returnValue = false;//还没找到让询问的窗口死了这条心吧好像是没失败过但是作为个人开发者总得想想不一样的
                 win = BrowserWindow.fromId(win.id);
           }
           //此时的win是ipc请求窗口的BrowserWindow对象,好家伙又一个对象,而我却new不到自己的对象
           win.close();//关闭窗口,但是这个是可以被网页阻止的,也可以监听得到然后比如储存下当前数据
           win.destroy();//同上但是这个是强制关闭的
        }
    
    

    我就做个演示,我个人时间很少就不讲其他的因为跟其他的没多少区别只是这个是多窗口的时候的方式

    坑2_复制文件到剪贴板

    就这个破东西我找了几个月,求助了N多大佬,说多了都是泪直到现在还是保持在能用就行

    • 复制图片
    //
    这个其实是最好弄得,因为左键就可以做到,或者复制x,y位置的图片详细见:https://www.electronjs.org/docs/api/menu
    https://www.electronjs.org/docs/api/menu-item
    https://www.electronjs.org/docs/api/web-contents
          写完这片文章还得继续敲代码来着不详细讲解可以私聊我问详细方法
    
          {label: "复制图片",click:(a,b,c)=>{let id=b.id;BrowserWindow.fromId(id).webContents.copyImageAt(clickEven.x, clickEven.y)},visible:false,enabled:true},
    
    • 复制文件到剪贴板,获取剪贴板文件位置
    。。。。这里省略一万句想吐槽的话,因为是跨平台应用这些功能基本上为0
    有心仪的npm库一看全都要编译…,编译每次都是失败,比打包还难。。。
    //获取剪贴板文件位置   坑还在,就是没办法获取多个文件的位置
    let clipboard = require('electron').clipboard;
    Mac: 
    let filePath = clipboard.read('public.file-url').replace('file://', '');
    Win:
    const rawFilePath = clipboard.readBuffer('FileNameW').toString('ucs2');
    let filePath = rawFilePath.replace(new RegExp(String.fromCharCode(0), 'g'), '');
    //一句就是
    let Filepath= clipboard.readBuffer('FileNameW').toString('ucs2').replace(new RegExp(String.fromCharCode(0), 'g'), '');
    
    

    重点来了复制文件

    //这个是开源项目一个复制文件到剪贴板的小C#插件  方案是调用命令行,但是杀毒软件老误报,虽然火绒一直很安静但是一看同事电脑,真好气哦,天天说我软件有问题,读写下文件也拦截,气死掉掉了,珍爱生命远离那些天天知道打广告然后又整天装腔作势的杀软,这敏感那敏感的
    window.file2clip = path.join(apppath, '..', '..', 'file2clip.exe');//插件位置
    [下载链接]('https://kiic.oss-cn-beijing.aliyuncs.com/file2clip.exe')
    详情请看开源项目:https://github.com/rostok/file2clip
    
    Copy_Path = (path) => {
        const { exec } = require('child_process');
        exec(`powershell.exe -ExecutionPolicy Bypass Start-Process -NoNewWindow -FilePath ${file2clip} -ArgumentList "${path}"`, function (error, stdout, stderr) {
            if (error) {
                console.error(error);
            }
            else {
                console.log("success");
            }
        });
    }
    
    //复制单文件:
    Copy_Path('F://这个文件夹要复制')
    //肥肠的比德弗 简单明了高性能
    

    在这里插入图片描述

    //复制多文件:
    Copy_Path('{"F://这个文件夹要复制" "F://这个文件说我也要.jpg" "F://这个文件说带我一个.psd"  "F://这个文件说我也是.js"}')
    看懂了么他的数组结构是{}然后空格区分文件位置文件路径加双引号 但是这里还是有个坑 文件路径带空格啥的会出错,就等大佬解答了
    //肥肠的比德弗 简单明了高性能
    

    在这里插入图片描述

    cs