Electron学习笔记(五)

文章目录

      • 相关笔记
      • 笔记说明
    • 七、系统
      • 1、系统对话框
      • 2、自定义窗口菜单
      • 3、系统右键菜单
      • 4、快捷键
        • (1)、监听网页按键事件 (窗口需处于激活状态)
        • (2)、监听全局按键事件 (窗口无需处于激活状态)
        • (3)、补充:自定义窗口菜单快捷键设置

相关笔记

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

笔记说明

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

七、系统

在搭建完基本的环境后

安装 remote 模块:

yarn add @electron/remote

1、系统对话框

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

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

app.on('ready', function() {
    win = new BrowserWindow({
        // 为页面集成Node.js环境
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            enableRemoteModule: true,
        }
    });

    require("@electron/remote/main").initialize();
    require("@electron/remote/main").enable(win.webContents);

    // 访问资源文件
    win.loadFile('index.html');

    // 程序启动后开启 开发者工具
    win.webContents.openDevTools();

    win.on('close',function() {
        win = null;
    })
});

app.on('window-all-closed',function() {
    app.quit();
})

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

<body>
    <button id="open_dialog_btn">选择文件</button>
    <script>
        const { dialog, app } = require('@electron/remote');

        function openDialog() {
            dialog.showOpenDialog({
                title: "选择文件",
                buttonLabel: "打开文件",
                defaultPath: app.getPath('desktop'),
                properties: ['multiSelections'],
                filters: [
                    { name: "图片", extensions: ["jpg", "png", "gif"] },
                    { name: "视频", extensions: ["mkv", "avi", "mp4"] }
                ]
            }).then((result) => {
                console.log(result);
            }).catch((err) => {
                console.log(err);
            });
        }

        // 点击按钮 弹出文件选择对话框
        let open_dialog_btn = document.querySelector('#open_dialog_btn');
        open_dialog_btn.addEventListener('click',function() {
            openDialog();
        })
    </script>
</body>

配置对象参数说明:

title:对话框标题
buttonLabel:确认按钮显示的文本
defaultPath:对话框打开后默认显示的路径
properties:设置 multiSelections,表示允许多选
filters:允许打开的文件类型

点击按钮后,效果如下:

效果展示

canceled:如若关闭了文件选择对话框,则为 true
filePaths:选择后的文件的路径

效果展示

更多对话框详情参见(Electron官网):https://www.electronjs.org/zh/docs/latest/api/dialog


2、自定义窗口菜单

新建一个文件 MyMenu.js 用于保存自定义菜单规则:

let { Menu } = require('electron');

let templateArr = [{
    label: "菜单1",
    submenu: [
        {
            label: "菜单1-1",
            type: 'checkbox'
        },
        // 添加分隔条
        { type: 'separator' },

        {
            label: "菜单1-2",
            tyep: 'radio'
        }
    ]
}, {
    label: "菜单2",
    click() {
        console.log('hello menu')
    },
},
{
    label: "菜单3",
    // 为菜单设置 role 属性
    // role 属性可选值:undo、redo、cut、copy、delete、selectAll、paste、minimize、
    // close、quit等,一个菜单项只能设置一个role值。
    role: 'reload'
},
{ label: "菜单4" }
];

let menu = Menu.buildFromTemplate(templateArr);

module.exports = menu;

index.js 文件中进行设置:

const {app,BrowserWindow} = require('electron');

const {Menu} = require('electron');
// 导入自定义菜单规则
const menu = require('./MyMenu');
// 应用自定义菜单
Menu.setApplicationMenu(menu);

let win = null;

app.on('ready', function() {
    win = new BrowserWindow({
        // 为页面集成Node.js环境
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        },
        // 隐藏系统菜单,但是按 Alt 键依然可以显示
        // autoHideMenuBar: true
    });
    // 访问资源文件
    win.loadFile('index.html');

    // 程序启动后开启 开发者工具
    win.webContents.openDevTools();

    win.on('close',function() {
        win = null;
    })
});

app.on('window-all-closed',function() {
    app.quit();
})

效果展示:

效果展示


3、系统右键菜单

右键菜单的内容我们沿用上面窗口菜单的内容,只需修改一下导入的模块即可 MyMenu.js 文件内容如下:

// 修改导入的模块 因为现在需要在渲染进程中使用
let { Menu } = require('@electron/remote');

let templateArr = [
    // 右键菜单内容
    // ...
];

let menu = Menu.buildFromTemplate(templateArr);

module.exports = menu;

index.html 文件内容如下:

<body>
    <script>
        const menu = require('./MyMenu');

        window.oncontextmenu = function(e) {
            e.preventDefault();
            menu.popup();
        }
    </script>
</body>

index.js 文件内容如下:

const {app,BrowserWindow} = require('electron');

let win = null;

app.on('ready', function() {
    win = new BrowserWindow({
        // 为页面集成Node.js环境
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            enableRemoteModule: true,
        },
        // autoHideMenuBar: true
    });

    require("@electron/remote/main").initialize();
    require("@electron/remote/main").enable(win.webContents);

    // 访问资源文件
    win.loadFile('index.html');

    // 程序启动后开启 开发者工具
    win.webContents.openDevTools();

    win.on('close',function() {
        win = null;
    })
});

app.on('window-all-closed',function() {
    app.quit();
})

运行结果:

运行结果


4、快捷键

(1)、监听网页按键事件 (窗口需处于激活状态)

index.html 文件内容如下:

方法一

<body>
    <script>
        window.onkeydown = function(e) {
            // 监听 ctrl+s 组合键
            if(e.ctrlKey && e.keyCode == 83) {
                console.log('保存文件');
            }
        }
    </script>
</body>

方法二:使用 mousetrap 作为按键事件监听库来监听网页按键事件

安装:yarn add mousetrap

<body>
    <script>
        let Mousetrap = require('mousetrap');

        Mousetrap.bind('ctrl+s',function() {
            console.log('--保存文件--');
        });

        Mousetrap.bind('ctrl+a',function() {
            console.log('--全选--');
        })
    </script>
</body>

mousetrap 更多详情参见:

  • https://github.com/ccampbell/mousetrap
  • https://www.npmjs.com/package/mousetrap?activeTab=readme
(2)、监听全局按键事件 (窗口无需处于激活状态)

更新 index.js 文件如下:

const { globalShortcut } = require('electron');

app.on('ready', function() {
    win = new BrowserWindow({
        // ...
    });
    globalShortcut.register('CommandOrControl+K', () => {
        console.log('abc');
    })
    // ...
});
(3)、补充:自定义窗口菜单快捷键设置

在自定义菜单文件 MyMenu.js 中利用 accelerator 属性设置快捷键:

{
    label: 'Dev Tools',
    role: 'toggleDevTools',
    // 设置快捷键 
    accelerator: 'Alt+R'
}

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

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

相关文章

力扣刷题 day2

快乐数 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;   图: java // 快乐数 --> 19 > 1^2 9 ^2 82 > 82 > 8 ^ 2 2 ^ 2 ......public boolean isHappy(int n) {// 使用快慢指针int slow n, fast getSum(n);while (slow ! fast) {slow getSum(slo…

十大排序算法之->归并排序

一、归并排序简介 归并排序是一种基于分治策略的有效且稳定的排序算法。归并排序由约翰冯诺伊曼提出&#xff0c;是计算机科学中一个非常基础且历史悠久的算法。 归并排序利用分治法的策略&#xff0c;将一个大的数组拆分成几个小的子数组&#xff0c;这些子数组各自独立地排…

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急&#xff08;消防&am…

免费体验GPT-4o这5大功能,非常好用!

这几天&#xff0c;OpenAI发布了新的GPT版本&#xff0c;GPT-4o&#xff0c;比GPT4更加智能也更快。 据说&#xff0c;GPT-4o在文本、推理和编码智能方面实现了GPT-4 Turbo级别的性能&#xff0c;在多语言、文本、音频和视觉功能方面甚至超过了市面上所有同类产品。 有几个亮点…

树链剖分详解,看这一篇就够了

前置知识&#xff1a; 树形结构链式前向星(熟练)线段树(熟练)DFS序(熟练)LCA(了解定义) 什么是树链剖分 树链剖分其实有两种&#xff1a;重链剖分和长链剖分。重链剖分就是把儿子节点最重的儿子称为重儿子&#xff0c;把树分成若干条重链&#xff08;如图一&#xff09;&#…

雍禾植发张东宏:以诚相待毛发患者

医学道路上的奋斗往往需要坚定的信念和不懈的努力。对于张东宏医生来说&#xff0c;医学并非止步于书本知识&#xff0c;而是一次次与患者对话、一次次实操中的历练和积累。在他的成长历程中&#xff0c;医学之路如同一棵参天大树&#xff0c;每一步都是扎实的打磨&#xff0c;…

2024年CSPM考试时间线梳理!

最近后台有朋友在问今年CSPM的考试安排&#xff0c;给大家整理一下&#xff0c;需要的朋友认真查看&#xff0c;不要错过考试。2024年5月12日举行了本年度第二次CSPM3级考试~接下来的考试安排如下&#xff1a; 1&#xff09;2024年CSPM考试安排 本次考试出成绩时间——2024年6…

【RSGIS数据资源】2001-2021 年亚洲季风区主要国家作物种植制度数据集

文章目录 1. 数据集概况2. 数据格式3. 文件名命名规则4. 数据生产服务单位5. 元数据6. 数据引用与参考文献引用 1. 数据集概况 2001-2021 年亚洲季风区主要国家作物种植制度数据集&#xff08;ACIA500&#xff09;是结合MODIS 影像和现有的土地利用等多源数据&#xff0c;基于…

QT状态机1-三态循环状态机

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)

【半夜学习MySQL】复合查询(含多表查询、自连接、单行/多行子查询、多列子查询、合并查询等详解)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 回顾基本查询多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 回顾基本查询 下面使用…

使用python给图片加上文字水印

使用python给图片加上文字水印 作用效果代码 作用 给图片加上文字水印文字水印的字体&#xff0c;颜色&#xff0c;位置可自定义 效果 原图&#xff1a; 加水印后的图&#xff1a; 代码 from PIL import Image, ImageDraw, ImageFontdef add_text_watermark(input_image…

Linux 无名信号量(Semaphore)的使用

目录 一、无名信号量的概念二、无名信号量相关函数三、信号量的使用步骤四、应用场景五、测试代码 一、无名信号量的概念 Linux无名信号量&#xff08;Semaphore&#xff09;   在Linux操作系统中&#xff0c;信号量&#xff08;Semaphore&#xff09;是一种用于进程间或线程…

OSG编程指南<二十三>:基于OSG+ImGui制作模型编辑器,实现三轴方向的实时平移、旋转和缩放变化

1、概述 在OSG的开发应用过程中&#xff0c;我们有时候总会纠结于使用MFC还是Qt来嵌入OSG窗口以便于后续的功能开发&#xff0c;毕竟选择一个合适的UI框架&#xff0c;对于后续的开发还是省去很多麻烦的。但对于初学者来说&#xff0c;可能对框架消息机制的不熟悉&#xff0c;尤…

景源畅信电商:做抖音有哪些未开发的蓝海领域?

在互联网信息爆炸的今天&#xff0c;抖音已经成为人们获取信息和娱乐的重要渠道。然而&#xff0c;随着用户数量的增加和内容的丰富&#xff0c;抖音的红海竞争也日益激烈。在这样的背景下&#xff0c;寻找还未被充分开发的蓝海领域&#xff0c;对于内容创作者来说&#xff0c;…

基于微信小程序+JAVA Springboot 实现的【智慧乡村旅游服务平台】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 基于微信小程序的智慧乡村旅游服务平台的设计与实现 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信开发者工具、uni-app其他技术&#xff1a…

Darknet+ros+realsenseD435i+yolo(ubuntu20.04)

一、下载Darknet_ros mkidr -p yolo_ws/src cd yolo_ws/src git clone --recursive https://github.com/leggedrobotics/darknet_ros.git #因为这样克隆的darknet文件夹是空的&#xff0c;将darknet_ros中的darknet的文件替换成如下 cd darknet_ros git clone https://github.…

自定义注解

例如写一个注解PrintTime 如下&#xff1a; import java.lang.annotation.*;//下面的注解属于元注解 Target({ElementType.PARAMETER,ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface PrintTime {/*** 注解的属性*/public S…

JavaScript 进阶(二)

一、深入对象 1. 创建对象的三种方式 利用 new Object 创建对象 2. 构造函数 【注意事项】 【例】 这样子写好之后&#xff0c;想要添加一个新的结构类似的对象&#xff0c;直接照着红圈中写&#xff0c;最后改相应的数据就好了 注意&#xff1a;红色是第一步&#xff0c;黄…

springboot004网页时装购物系统

springboot004网页时装购物系统 亲测完美运行带论文&#xff1a;获取源码&#xff0c;私信评论或者v:niliuapp 运行视频 包含的文件列表&#xff08;含论文&#xff09; 数据库脚本&#xff1a;db.sql其他文件&#xff1a;ppt.pptx论文/文档&#xff1a;开题报告.docx论文&…

如何利用命令提示符列出文件?这里提供了几个实例供你参考

序言 什么命令可以用来列出目录中的文件&#xff1f;如何在命令提示符Windows 10/11中列出文件&#xff1f;很多人对这些问题感到困惑。在这篇文章中&#xff0c;我们详细解释了命令提示符列出文件的主题。 CMD&#xff08;命令提示符&#xff09;是一个功能强大的Windows内置…