探索 Electron:快捷键与剪切板操作

news2024/11/15 5:10:11

Electron是一个开源的桌面应用程序开发框架,它允许开发者使用Web技术(如 HTML、CSS 和 JavaScript)构建跨平台的桌面应用程序,它的出现极大地简化了桌面应用程序的开发流程,让更多的开发者能够利用已有的 Web 开发技能来构建功能强大且跨平台的应用程序,这对于提升开发效率和应用程序的快速交付具有重要意义。

目录

快捷键

剪切板


快捷键

        在应用程序没有键盘焦点时,我们可以通过监听键盘事件globalShortcut模块可以在操作系统中注册/注销全局快捷键, 以便可以为操作定制各种快捷键。

注意:因为快捷方式是全局的,即使应用程序没有键盘焦点,它也仍然在持续监听键盘事件,在应用程序模块发出ready事件之前,不应该使用此模块,这里我们通过一段代码对快捷键的注册和销毁做一下演示:

// app应用;BrowserWindow 窗口
const { app, BrowserWindow, globalShortcut } = require('electron')
const path = require('path')

const createWindow = () => {
    const win = new BrowserWindow({ // 窗口的配置
        width: 800, 
        height: 600, 
        icon: 'logo.png', 
        title: "亦世凡华、",
        webPreferences: {
            preload: path.resolve(__dirname, './preload.js') // 预加载脚本
        }        
    })
    win.loadFile('./src/index.html') // 加载页面
    globalShortcut.register('g', () => {
        console.log("快捷键 g 注册成功")
    })
    globalShortcut.register('h', () => {
        console.log("将快捷键 g 注销掉")
        globalShortcut.unregister('g')
    })
}

这里我们通过桌面端界面的演示,可以看到我们的快捷键被注册和销毁成功了:

如果想在桌面端退出的时候取消某个或者全部的快捷键,可以在生命周期will-quit进行,如下:

// 桌面端快要退出的时候,注销快捷键
app.on('will-quit', () => {
    globalShortcut.unregister('ctrl + q') // 注销单个快捷键
    globalShortcut.unregisterAll() // 注销所有快捷键
})

剪切板

剪切在桌面端是常见的功能,顾名思义就是在系统剪贴板上执行复制和粘贴操作,然后最新版本的electron中给其加了一个限制就是只能在非沙盒下使用,如下:

什么是沙盒:是一种安全机制,用于增强应用程序的安全性和稳定性,它主要通过限制渲染进程(web 页面)的权限来实现,例如只允许访问特定目录或文件。这可以防止恶意代码修改或删除用户的文件。

在最新版本的 Electron 中,沙盒机制是可选的,并且需要在应用程序的启动配置中明确启用。它不仅限制了渲染进程的权限,还提供了一些额外的安全性措施,如堆栈限制和沙盒内的特权分离。这些措施有助于最大程度地隔离和保护渲染进程,确保即使出现漏洞,也不会波及到整个应用程序或用户系统。所以如果我们想开启剪切操作,则需要关闭沙盒,如下:

接下来我们就需要在预加载脚本中编写相应的剪切clipboard函数的操作,然后在渲染进行中进行调用了,代码过程如下所示:

最终呈现的效果如下所示:

当然这里我们也可以对图片进行一个剪切粘贴的操作,这里我们在预加载脚本文件中进行如下操作,这里我们借助 Electron 框架中的一个模块,用于创建原生的图像对象,可以通过 NativeImage 创建和操作系统级别相关的图像对象,例如窗口图标、菜单图标、应用程序图标等。它提供了一种跨平台的方式来处理和操作图像,使开发者能够在 Electron 应用中使用原生的图像功能:

const { contextBridge, clipboard, nativeImage } = require("electron")

// 复制文本
const copy = (data) => {
    clipboard.writeText(data)
}
// 读取文本
const read = (data) => {
    return clipboard.readText(data)
}
// 复制图片
const addImage = (data) => {
    // 将图片放置于剪切板当中的时候要求图片类型属于 nativeImage 实例
    let oImagg = nativeImage.createFromPath(data)
    clipboard.writeImage(oImagg)
    // 将剪切板中的图片作为dom元素显示在界面上
    let oImg = clipboard.readImage()
    let oImgDom = new Image()
    oImgDom.src = oImg.toDataURL()
    document.body.appendChild(oImgDom)
}

contextBridge.exposeInMainWorld('myAPI', {
    copy,
    read,
    addImage
})

然后我们在渲染进行进行调用函数然后传递对应的图片路径即可,如果控制台报出图片资源相关的错误问题,可以在index.html文件中替换一下下面的文件即可:

<meta http-equiv="Content-Security-Policy" content="connect-src *; default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">

最终呈现的效果如下所示:

当然还有一些其他的功能如下,其他功能就不再详细赘述了,后面做项目用到的时候再进行阐述吧

shell模块:提供与桌面集成相关的功能,在用户的默认浏览器中打开url:

const { shell } = require('electron')
shell.openExternal('https://www.baidu.com') // 打开外部链接
shell.showItemInFolder(path.resolve(__dirname)) // 打开文件管理器

消息通知:通过Notification我们可以在桌面端中向电脑发送消息:

window.onload = function() {
    let btn = document.getElementsByClassName("btn")[0];

    btn.addEventListener('click', ()=> {
        let option = {
            title: '亦世凡华、',
            body: '一键三联,求关注',
            icon: './logo.png'
        }
        new Notification(option.title, option);
    })
}

最终呈现的效果如下所示:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql9安装

目录 一、下载mysql 二、安装 三、配置mysql环境变量 四、mysql初始化和启动 1.以管理员身份运行cmd 2.cd到mysql的安装目录 3.初始化mysql的数据库 4.为Windows系统安装MySQL服务 5.查看一下名为mysql的服务&#xff1a; 6.启动MySQL服务 五、附录 1.系统变量还在&…

grafana对接zabbix数据展示

目录 1、初始化、安装grafana 2、浏览器访问 3、安装zabbix 4、zabbix数据对接grafana 5、如何导入模板&#xff1f; ① 设置键值 ② 在zabbix web端完成自定义监控项 ③ garafana里添加nginx上面的的三个监控项 6、如何自定义监控项&#xff1f; 以下实验沿用上一篇z…

arm环境下构建Flink的Docker镜像

准备工作 资源准备 按需下载 flink&#xff0c;我的是1.17.2版本。官方说1.13版本之后的安装包兼容了arm架构&#xff0c;所以直接下载就行。 如需要cdc组件&#xff0c;提前下载好。 服务器准备 可在某云上购买arm服务器&#xff0c;2c/4g即可&#xff0c;按量付费。 带宽…

2024datawhale电力需求预测挑战赛

电力需求预测挑战赛 比赛链接&#xff1a;https://challenge.xfyun.cn/topic/info?typeelectricity-demand&optionssgy&chdw24_uGS8Gs 学习链接&#xff1a;https://datawhaler.feishu.cn/wiki/CuhBw9vBaiG1nJklIPkcRhqVnmk 一句话介绍赛题任务可以这样理解赛题&am…

【Vue实战教程】之Vuex状态管理详解

Vuex状态管理 1 Vuex简介 1.1 什么是Vuex Vuex是一个专为Vue.js应用程序开发的状态管理工具。它采用了集中式存储管理应用的所有的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简单来说&#xff0c;Vuex是一个适用于在Vue项目开发时使用的状态管理…

Nginx反向代理概述

正向代理与反向代理概述 正向代理&#xff1a; 定义&#xff1a;正向代理位于客户端和目标服务器之间&#xff0c;客户端的请求首先发送到代理服务器&#xff0c;然后由代理服务器转发到目标服务器&#xff0c;最后将目标服务器的响应返回给客户端。 作用&#xff1a;正向代理…

逻辑回归推导

逻辑回归既可以看作是回归算法&#xff0c;也可以看做是分类算法。通常作为分类算法使用&#xff0c;只可以解决二分类问题。 在上述平面中&#xff0c;每个颜色代表一个类别&#xff0c;即有4个类别 将红色的做为一个类别&#xff0c;其他三个类别都统称为其他类别&#xff0…

javascript 的上下文与作用域

目录 1. 初步了解 上下文&#xff08;context&#xff09;2. 全局上下文(global context)3. 上下文栈 (context stack)4. 作用域链( scope chain)5. 作用域(scope)6. 作用域链增强7. 变量声明7.1 var 声明变量7.2 let 声明变量7.3 const 常量声明 8. 标识符查找总结 带着疑问去…

D3.高精度

1.分类情况 AB、A-B、A*a、A/b A和B指的是超大超长整数&#xff0c;长度<1e6; a的值<10000&#xff1b; 2.大整数的存储 int 变量肯定是存不了这么大的数的&#xff0c;做法是将大整数先存到string字符串&#xff0c;再使用字符串的访问方式&#xff0c;将每一位数存到…

C++树形结构(3 树的中心、重心)

目录 一.树的中心&#xff1a; 1.树的概念&#xff1a; 2.树的性质&#xff1a; 性质1&#xff1a; 性质2&#xff1a; 3.树的中心求解&#xff1a; 4.例题&#xff1a; 二.树的重心&#xff1a; 1.基础概念&#xff1a; 2.求解方法&#xff1a; 3.例题&#xff1a;…

运筹学笔记

计算的时间问题&#xff01;计算机解决了计算量的问题&#xff01; 计算机的发展对运筹学研究起到了极大的促进作用。 运筹学的一个特征之一是它常常会考虑寻求问题模型的最佳解决方案&#xff08;称为最优解&#xff09;。 没有人能成为运筹学所有方面的专家。 分析学越来越流…

反弹shell的方式——之NC反弹shell

反弹shell是指在攻击机监听某个端口&#xff0c;然后通过目标连接攻击机监听的端口&#xff0c;在攻击机反弹得到目标机的shell。通常在目标网络有防火墙或者其他因素限制&#xff0c;导致无法持续控制目标&#xff0c;或者执行命令受阻等情况时需要进行反弹shell 常见的反弹s…

Null和 Undefined 两者区别?

1、 Undefined 和 null 的 区 别 首 先 Undefined 和 Null 都 是 基 本 数 据 类 型 &#xff0c; 这 两 个 基 本 数 据 类 型 分 别 都 只 有 一 个 值 &#xff0c; 就 是 undefined 和 null。 2、undefined 代 表 的 含 义 是 未 定 义 &#xff0c; null 代 表 的 含 义 …

Python Flask入门到精通:详细教程和实战案例

前言 Flask是一个轻量级的Web框架&#xff0c;用于快速开发Web应用程序。它的设计理念是简洁、灵活和易于扩展&#xff0c;非常适合于从简单的单页应用到复杂的大型项目。通过Flask&#xff0c;可以创建各种Web应用程序&#xff0c;比如博客、电子商务网站、RESTful API等。 …

META 备受期待的 Llama 3 405B 即将发布

本心、输入输出、结果 文章目录 META 备受期待的 Llama 3 405B 即将发布前言Llama 3 405B或许会彻底改变专用模型的数据质量Llama 3 405B将形成新的模型生态系统:从基础模型到专家组合Llama 3 405B有最高效 API 的竞争Llama 3 405B 基准测试META 备受期待的 Llama 3 405B 即将…

韦东山嵌入式linux系列-具体单板的按键驱动程序(查询方式)

1 GPIO 操作回顾 &#xff08;1&#xff09;使能模块&#xff1b; &#xff08;2&#xff09;设置引脚的模式&#xff08;工作于GPIO模式&#xff09;&#xff1b; &#xff08;3&#xff09;设置GPIO本身&#xff08;输入/输出&#xff09;&#xff1b; &#xff08;4&…

Linux_make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

UE4-构建光照后导入的静态网格体变黑

当我们将我们的静态网格体导入到项目当中的时候&#xff0c;此时我们进行重新构建光照&#xff0c;我们在从新构建完光照后&#xff0c;会发现我们的静态网格体全部变黑了&#xff0c;此时是因为没有设置光照贴图分辨率和坐标索引引起的。 将General Settings中的L…

Unite 上海 强势回归

​​​ 他回归了 Unite 大会是一年一度的 Unity 全球开发者盛会。今年&#xff0c;Unite 将于 7 月盛夏点亮上海外滩。此次盛会&#xff0c;我们将以“团结”为核心&#xff0c;凝聚全球 3000 多位 Unity 社区精英的力量&#xff0c;共同开启 Unity 技术的新纪元。 在这里&am…

【C++】透析类和对象(上)

有不懂的&#xff0c;可翻阅我之前文章哦&#xff01; 个人主页&#xff1a;CSDN_小八哥向前冲 所属专栏&#xff1a;C入门 目录 类的定义 访问限定符 类域 类的实例化 实例化概念 对象大小 this指针 类的默认成员函数 构造函数 析构函数 模拟栈&#xff08;初学者&…