Electron学习笔记(六)

文章目录

      • 相关笔记
      • 笔记说明
    • 七、系统
      • 5、托盘图标
        • (1)、设置托盘图标
        • (2)、托盘图标闪烁
        • (3)、托盘图标菜单
      • 6、剪切板
        • (1)、写入剪切板
        • (2)、读取剪切板
      • 7、系统通知
      • 8、其他
        • (1)、使用系统默认应用打开文件
        • (2)、接收拖拽到窗口中的文件
        • (3)、使用系统字体

相关笔记

  • Electron学习笔记(一)
  • Electron学习笔记(二)
  • Electron学习笔记(三)
  • Electron学习笔记(四)
  • Electron学习笔记(五)
  • Electron学习笔记(六)
  • 使用 electron-vite-vue 构建 electron + vue3 项目并打包

笔记说明

文本为学习《Electron 实战 入门、进阶与性能优化 刘晓伦 著》时所记录的笔记 主要将书本上的案例运行一遍,针对原理部分并无相关记录。笔记记录于 2023年9月。

七、系统

5、托盘图标

(1)、设置托盘图标

更新 index.js 文件内容如下:

const {app,BrowserWindow,Tray} = require('electron');
let path = require('path');
let tray;
let win = null;

app.on('ready', function() {
    win = new BrowserWindow({
        // ...
    });
    // 获取 图标路径
    let iconPath = path.join(__dirname, 'icon.ico');
    tray = new Tray(iconPath);
    // ...
});
(2)、托盘图标闪烁

更新 index.js 文件内容如下:

const {app,BrowserWindow,Tray} = require('electron');
let path = require('path');
let tray;

let win = null;
let iconPath = path.join(__dirname, 'icon.ico');
let iconPath2 = path.join(__dirname, 'icon2.ico');
let flag = true;

app.on('ready', function() {
    win = new BrowserWindow({
        // ...
    });

    tray = new Tray(iconPath);
    // ...
});

setInterval(() => {
    if (flag) {
        tray.setImage(iconPath2);
        flag = false;
    } else {
        tray.setImage(iconPath);
        flag = true;
    }
}, 600)

效果展示:

效果展示

(3)、托盘图标菜单

更新 index.js 文件内容如下:

const { app, BrowserWindow, Tray, Menu } = require('electron');
let path = require('path');
let tray;

let win = null;
app.on('ready', function () {
    win = new BrowserWindow({
        // ...
    });

    let iconPath = path.join(__dirname, 'icon.ico');
    tray = new Tray(iconPath);

    // 响应鼠标点击事件
    tray.on('click', function () {
        win.show();
    });

    // 鼠标右键菜单
    let menu = Menu.buildFromTemplate([{
        click() { win.show(); },
        label: '显示窗口',
        type: 'normal'
    }, {
        click() { app.quit(); },
        label: '退出应用',
        type: 'normal'
    }]);
    tray.setContextMenu(menu);

    // ...
});

效果展示:

效果展示


6、剪切板

(1)、写入剪切板

clipboard:该模块渲染进程和主进程都可以直接使用。

文本内容写入:更新 index.html 文件内容如下:

<input type="text" name="" id="">

<script>
    let { clipboard } = require("electron");
    // 向剪切板写入文本
    clipboard.writeText("你好Text");  

    // 向剪切板写入HTML        
    // clipboard.writeHTML("<h1>你好HTML</h1>");        
</script>

图片内容写入:程序运行后可在word文档或聊天框中粘贴

<body>
    <script>
        let path = require("path");
        let { clipboard, nativeImage } = require("electron");

        let imgPath = path.join(__dirname, "1.jpg");
        let img = nativeImage.createFromPath(imgPath);
        clipboard.writeImage(img);
    </script>
</body>

清空剪切板:

clipboard.clear();

(2)、读取剪切板

读取剪切板内的文本内容:更新 index.html 文件内容如下:

<body>
    <input type="text" name="" id="">
    <script>
        let { clipboard } = require("electron");
        console.log(clipboard.readText());        // 读取剪切板的文本
        // clipboard.readHTML();        // 读取剪切板的HTML
    </script>
</body>

读取剪切板内的图片内容

<body>
    <script>
        let { clipboard } = require("electron");

        // 获取在系统文件夹里复制的图片文件路径
        let filePath = clipboard.readBuffer('FileNameW').toString('ucs2')
        filePath = filePath.replace(RegExp(String.fromCharCode(0), 'g'), '');

        // 创建一个 img 元素写入页面
        let imgDom = document.createElement('img')
        imgDom.src = filePath;
        document.body.appendChild(imgDom);
    </script>
</body>

7、系统通知

更新 index.html 文件内容如下:

<body>
    <script>
        Notification.requestPermission(function (status) {
            if (status === "granted") {
                let notification = new Notification('来自Electron程序的消息', {
                    body: '测试系统消息发送'
                });

                notification.onclick = function () {
                    alert('用户点击了系统消息');
                }
            } else {
                // 用户拒绝授权
            }
        });
    </script>
</body>

效果展示:

效果展示


8、其他

(1)、使用系统默认应用打开文件

shell:该模块可以被 Electron 中主进程和渲染进程直接使用。

使用 shell 模块打开默认浏览器:

<body>
    <script>
        const { shell } = require("electron");
        shell.openExternal('https://www.baidu.com');
    </script>
</body>

使用 shell 模块打开 word 文档:

<body>
    <script>
        const { shell } = require("electron");
        let openFlag = shell.openPath("D:\\桌面\\test.docx");

        console.log(openFlag);
    </script>
</body>

使用 shell 模块将文件移入垃圾箱:(说明:经测试,该代码在主进程中有效,但在渲染进程中会报错)

index.js 文件中添加以下内容:

const { shell } = require("electron");
let delFlag = shell.trashItem("D:\\桌面\\test.docx");

console.log(delFlag);

关于 shell 模块更多详情参见:https://www.electronjs.org/zh/docs/latest/api/shell


(2)、接收拖拽到窗口中的文件

修改 index.html 文件内容如下:

<body>
    <script>
        document.addEventListener('dragover', ev => {
            ev.preventDefault();
            console.log('请在此处放置文件');
        });

        document.addEventListener('drop', ev => {
            console.log(ev.dataTransfer.files);
            ev.preventDefault();
        });
    </script>
</body>

效果展示:

效果展示


(3)、使用系统字体
<div style="font:caption">这是我的标题</div>
<div style="font:menu">菜单中的字体</div>
<div style="font:message-box">对话框中的字体</div>
<div style="font:status-bar">状态栏中的字体</div>

效果展示:

效果展示


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/617038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 驾校管理 设计与实现

一.项目介绍 系统角色&#xff1a;管理员、驾校教练、学员 管理员&#xff1a; 个人中心&#xff1a;修改密码以及个人信息修改 学员管理&#xff1a;维护学员信息&#xff0c;维护学员成绩信息 驾校教练管理&#xff1a;驾校教练信息的维护 驾校车辆管理&…

基于python的旅游爬虫可视化与实现

摘要 本项目为基于python的旅游爬虫可视化的设计与实现&#xff0c;项目以Web系统形式展示&#xff0c;利用Xpath爬虫爬取去哪儿网针对旅游业的需求&#xff0c;对国内热门旅游景点数据可视化系统&#xff0c;将爬取好的数据保存为CSV文件&#xff0c;再通过ORM框架导入MySQL数…

[muduo网络库]——muduo库Buffer类(剖析muduo网络库核心部分、设计思想)

接着之前我们[muduo网络库]——muduo库Socket类&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;我们接下来继续看muduo库中的Buffer类。其实Buffer在我的另一篇博客里面已经介绍过了深究muduo网络库的Buffer类&#xff01;&#xff01;&#xff01;&am…

十四、Redis Cluster集群

Redis Cluster是Redis提供的一个分布式解决方案&#xff0c;在3.0推出。Redis Cluster可以自动将数据分片分布到不同的master节点上&#xff0c;同时提供了高可用的支持&#xff0c;当某个master节点挂了之后&#xff0c;整个集群还是可以正常工作。1、为什么要用Redis Cluster…

Kafka 业务日志采集最佳实践

简介 Apache Kafka 是一个分布式流处理平台&#xff0c;主要用于构建实时数据流管道和应用程序。在收集业务日志的场景中&#xff0c;Kafka 可以作为一个消息中间件&#xff0c;用于接收、存储和转发大量的日志数据。将 Kafka 与其他系统&#xff08;如 Elasticsearch、Flume、…

AtCoder Beginner Contest 353 A~E(F,G更新中...)

A.Buildings 题意 给出若干个建筑&#xff0c;每个建筑有一个高度&#xff0c;问&#xff0c;从第二个建筑开始&#xff0c;比第一个建筑高的建筑中编号最小的是多少&#xff1f;如果不存在&#xff0c;输出-1. 分析 边输入边比较即可&#xff0c;如果循环结束还未找到&…

【muzzik 分享】Cocos 物理帧同步

# 前言 之前没研究帧同步&#xff0c;这是我前端时间没上班时边玩边搞做的 Demo 研究成果&#xff0c;总共时间一周&#xff08;实际2-3天&#xff09;&#xff0c;发布的目的也很简单&#xff0c;打破技术垄断&#xff0c;才能诞生更高端的技术成果。而且就算我没发这篇帖子&…

重生奇迹mu战士攻略有哪些

1、生命之光&#xff1a;PK前起手式&#xff0c;增加血上限。 2、雷霆裂闪&#xff1a;眩晕住对手&#xff0c;战士PK战士第一技能&#xff0c;雷霆裂闪是否使用好关系到胜负。 3、霹雳回旋斩&#xff1a;雷霆裂闪后可以选择用霹雳回旋斩跑出一定范围(因为对手下一招没出意外…

Mybatis技术内幕-基础支撑层

整体架构 MyBatis 的整体架构分为三层&#xff0c; 分别是基础支持层、核心处理层和接口层。 基础支持层 基础支持层包含整个MyBatis 的基础模块&#xff0c;这些模块为核心处理层的功能提供了良好的支撑。 解析器模块 XPathParser MyBatis提供的XPathParser 类封装了XPat…

SpringCloud使用Nacos作为配置中心实现动态数据源切换

一、Nacos-Server 了解Nacos可以直接阅读官方文档 使用Nacos&#xff0c;我们需要有Nacos-Server&#xff0c;此处就不使用官方提供的release版本了&#xff0c;而是自己编译&#xff0c;因为本来就是Java开发的&#xff0c;所以对于Javaer来说也没啥难度&#xff01; git c…

记nrm管理仓库以及发布npm包

前言 记一次在公司创建私有库以及发布npm包&#xff0c;留下个脚印 一、nrm是什么&#xff1f; nrm是 npm 镜像源管理工具&#xff0c;用于快速地在不同的 npm 源之间切换。 二、使用步骤 1.全局安装nrm 代码如下&#xff08;示例&#xff09;&#xff1a; npm install -…

Git系列:git diff使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【智能算法】鹭鹰优化算法(SBOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;Y Fu受到自然界中鹭鹰生存行为启发&#xff0c;提出了鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;。 2.算法原理 2.1算法思想…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

OpenGL导入的纹理图片错位

在OpenGL中导入图片的纹理照片的函数为 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, p_w, p_h, 0, GL_BGR, GL_UNSIGNED_BYTE, pic_data);其中p_w, p_h为图片的宽和高&#xff0c;pic_data为指向图片存储空间的的地址(unsigned char *类型) 在OpenGL中图片默认是4字节对齐的&…

Web开发小知识点(二)

1.关于取余 我在Dart语言里&#xff08;flutter项目&#xff09; int checkNum (10 - 29) % 10; 那么checkNum等于1 但是在Vue项目里 const checkNum (10 - 29) % 10;却等于-9 语言的特性不同&#xff0c;导致结果也不同&#xff0c;如果要想和Dart保持一致&#xff0c;…

vue3.0(六) toRef,toValue,toRefs和toRow,markRaw

文章目录 toReftoValuetoRefstoRowmarkRawtoRef和toRefs的区别toRaw 和markRaw的用处 toRef toRef 函数可以将一个响应式对象的属性转换为一个独立的 ref 对象。返回的是一个指向源对象属性的 ref 引用&#xff0c;任何对该引用的修改都会同步到源对象属性上。使用 toRef 时需…

[蓝桥杯 2021 国 ABC] 123(java)——前缀和,思维

目录 题目 解析 代码 这么久了&#xff0c;我终于能不看别人代码完整写出来了&#xff0c;呜呜呜。虽然过程也是很曲折。 题目 解析 这个题&#xff0c;找其中数列的规律&#xff0c;1,1,2,1,2,3,1,2,3,4&#xff0c;...&#xff0c;因此我们把拆分成行列&#xff0c;如下…

Java并发处理

Java并发处理 问题描述:项目中业务编号出现重复编号 生成编号规则&#xff1a;获取数据库表最大值&#xff0c;然后再做1处理&#xff0c;即为新编号&#xff08;因为起始值是不固定的&#xff0c;还存在‘字符数据’格式&#xff0c;做了字典项可配置&#xff0c;所以不能直…

Ai 一键美术绘画文章,蓝海项目,流量巨大,盈利成效显著

今天我要向大家介绍一个全新的蓝海项目&#xff0c;那就是AI一键美术绘画文章。这个项目打破了传统的思维模式&#xff0c;更加吸引人的眼球&#xff0c;已经在各大网站上引发了大量的关注&#xff0c;轻松在抖音上热门也变得简单易行且稳定。 下载 地 址 &#xff1a; laoa…