Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)
electronjs官网 https://www.electronjs.org/zh/
Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。
Electron是什么?
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron ,允许您保持一个JavaScript 代码库并创建在Windows,macOS和Linux上运行的跨平台应用——不需要本地开发经验。
快速入门
入门教程可以去官网查看 https://www.electronjs.org/zh/docs/latest/tutorial/quick-start
如何调用系统本地函数库
最开始调研了 node-ffi-napi. 然后发现没有办法用起来。—— 我的node版本比较高(v21.6.2),其他所有的依赖都是最新版。后来看了这里的讨论(https://github.com/node-ffi-napi/node-ffi-napi/issues/273) ,有人推荐了node-ffi-rs 和 koffi。于是选择了入门比较简单的koffi。
实例
要实现的功能:使用 Electron 并希望创建一个页面,里面有一个按钮用于切换 Photoshop 窗口的显示与隐藏(隐藏UI窗口,但是photoshop依然可以通过websocket在后台处理任务),以下是实现步骤和完整代码:
步骤:
- 在 Electron 中,我们可以使用 Node.js 和 koffi 来调用 Win32 API。
- 在 Electron 的主进程中处理 Photoshop 窗口的显示与隐藏。
- 在渲染进程中使用 HTML 和 JavaScript 创建一个按钮,并通过 IPC(进程间通信)与主进程交互,来切换 Photoshop 的显示状态。
完整代码
1. 创建主进程 (main.js)
主进程负责与系统 API(通过 koffi)交互,判断 Photoshop 是否隐藏,并切换其状态。
const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const koffi = require('koffi');
const os = require('os');let mainWindow;// 创建窗口并加载 HTML 页面
function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js'),nodeIntegration: false,contextIsolation: true}});mainWindow.loadFile('index.html');
}// 处理 Photoshop 窗口显示/隐藏
ipcMain.handle('toggle-photoshop', () => {// 确保是在 Windows 系统下才执行if (os.platform() !== 'win32') {console.log('当前操作系统不是 Windows,无法执行操作。');return;}// 加载 user32.dllconst user32 = koffi.load('user32.dll');// 绑定必要的函数const FindWindowA = user32.func('void* FindWindowA(const char*, const char*)');const ShowWindow = user32.func('bool ShowWindow(void*, int)');const IsWindowVisible = user32.func('bool IsWindowVisible(void*)');const SW_HIDE = 0; // 隐藏窗口const SW_SHOW = 5; // 显示窗口// 找到 Photoshop 窗口句柄const hWnd = FindWindowA('Photoshop', null); // 使用 Photoshop 的类名if (!hWnd) {console.log('未找到 Photoshop 窗口');user32.close();return;}// 检查窗口是否可见const isVisible = IsWindowVisible(hWnd);if (isVisible) {console.log('Photoshop 窗口已显示,隐藏中...');ShowWindow(hWnd, SW_HIDE);} else {console.log('Photoshop 窗口已隐藏,显示中...');ShowWindow(hWnd, SW_SHOW);}// 释放动态链接库user32.close();
});app.whenReady().then(createWindow);app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit();}
});
2. 创建渲染进程 HTML 页面 (index.html)
在渲染进程中,创建一个按钮,用户点击时触发与主进程的通信来切换 Photoshop 的显示状态。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Photoshop Toggle</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f4f4f4;}.button {padding: 10px 20px;font-size: 16px;cursor: pointer;background-color: #4CAF50;color: white;border: none;border-radius: 5px;}.button:hover {background-color: #45a049;}</style>
</head>
<body><button id="toggleButton" class="button">切换 Photoshop 显示/隐藏</button><script>const { ipcRenderer } = require('electron');// 绑定按钮点击事件,调用主进程处理 Photoshop 的显示/隐藏document.getElementById('toggleButton').addEventListener('click', async () => {await ipcRenderer.invoke('toggle-photoshop');});</script>
</body>
</html>
3. 创建 Preload 脚本 (preload.js)
在 preload.js 中启用 IPC 通信,以便渲染进程和主进程之间进行交互。
const { contextBridge, ipcRenderer } = require('electron');// 暴露给渲染进程的方法
contextBridge.exposeInMainWorld('electron', {togglePhotoshop: () => ipcRenderer.invoke('toggle-photoshop')
});
代码说明:
- 主进程(main.js):
• createWindow 用于创建并加载应用程序的窗口。
• 使用 ipcMain.handle 来处理渲染进程发来的请求(这里是切换 Photoshop 窗口显示与隐藏)。
• 通过 koffi 库加载 user32.dll,使用 FindWindowA(windows官网文档) 查找 Photoshop 窗口的句柄,使用 ShowWindow 切换窗口的显示与隐藏状态。 - 渲染进程(index.html):
• 页面中有一个按钮,点击按钮后触发 togglePhotoshop 方法,向主进程请求切换 Photoshop 窗口的显示状态。
• 使用 ipcRenderer 向主进程发送请求。 - Preload 脚本(preload.js):
• 通过 contextBridge 暴露了 togglePhotoshop 方法给渲染进程,使渲染进程可以调用主进程的方法。 - koffi 调用:
• FindWindowA 查找 Photoshop 窗口。
• ShowWindow 切换 Photoshop 窗口的显示/隐藏状态。
• IsWindowVisible 用来判断 Photoshop 当前是否可见。
代码运行:
- 确保你已经安装了 Electron 和 koffi 模块:
npm install electron koffi
- 运行 Electron 应用:
npx electron .
- 打开应用,点击按钮切换 Photoshop 窗口的显示和隐藏。
注意事项:
• 权限:确保你以管理员权限运行 Electron,这样才能操作系统窗口。
• Photoshop 类名:默认情况下,Photoshop 的类名是 “Photoshop”,如果不行,可能需要通过工具(如 Spy++)确认准确的类名。
相关文章:
Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)
electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…...
C语言编程1.27汉诺塔
题目描述 给定一个由n个圆盘组成的塔,这些圆盘按照大小递减的方式套在第一根桩柱上。现要将整个塔移动到另一根桩柱上,每次只能移动一个圆盘,且较大的圆盘在移动过程中不能放置在较小的圆盘上面。 输入格式 输入由四行: 第一行…...
UG NX二次开发(C#)-机电概念设计-UIStyler中selection块选择信号等对象的过滤器设置
文章目录 1、前言2、创建机电概念设计的模型3、创建UIStyler4、在VS2022中创建NXOPEN CSHAP的工程5、设置信号与信号适配体的过滤器6、测试选择的对象1、前言 在UG NX二次开发过程中,经常会用到UIStyler中的Selection块,即是选择对象,选择对象由于其可以选择多种类型的对象…...
【C++】C++中的lambda函数详解
C中的lambda函数是一种匿名函数,它允许你在代码中直接定义一个函数对象,而不需要提前声明一个函数名。Lambda函数通常用于编写简短的函数,这些函数可能只会被调用一次或者在某些特定的上下文中使用。 Lambda函数的基本语法如下: …...
JS CSS HTML 的代码如何快速封装
我们为什么要封装代码,是因为封装后的代码,会显得非常美观,减少代码的复用,方便我们更好的去维护代码,不用一个一个页面的去找去改,直接封装好的代码里面去改就可以了 目录 1.html代码封装 2.CSS代码封装…...
矩阵运算的复杂度分析(Complexity Analysis of Matrix Operations):中英双语
矩阵运算的复杂度分析 矩阵运算在科学计算、机器学习、图像处理等领域中起着至关重要的作用。了解各种常见矩阵运算的复杂度,对于优化算法、提高计算效率具有重要意义。在这篇博客中,我们将详细探讨矩阵加法、标量乘法、矩阵转置、矩阵-向量乘法等基本矩…...
第二十四天 循环神经网络(RNN)LSTM与GRU
LSTM(长短期记忆网络)和GRU(门控循环单元)是两种流行的循环神经网络变体,它们被设计来解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。这两种网络都通过引入门控机制来控制信息的流动,从而能…...
RTC实时时钟
BKP(备份寄存器) 1. 什么是BKP? 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电 源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒ÿ…...
移动网络(2,3,4,5G)设备TCP通讯调试方法
背景: 当设备是移动网络设备连接云平台的时候,如果服务器没有收到网络数据,移动物联设备发送不知道有没有有丢失数据的时候,需要一个抓取设备出来的数据和服务器下发的数据的方法。 1.服务器系统是很成熟的,一般是linu…...
项目二十三:电阻测量(需要简单的外围检测电路,将电阻转换为电压)测量100,1k,4.7k,10k,20k的电阻阻值,由数码管显示。要求测试误差 <10%
资料查找: 01 方案选择 使用单片机测量电阻有多种方法,以下是一些常见的方法及其原理: 串联分压法(ADC) 原理:根据串联电路的分压原理,通过测量已知电阻和待测电阻上的电压,计算出…...
如何使用checkBox组件实现复选框
文章目录 概念介绍使用方法示例代码我们在上一章回中介绍了DatePickerDialog Widget相关的内容,本章回中将介绍Checkbox Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Checkbox也是叫复选框,没有选中时是一个正方形边框,边框内容是空白的,选中时会…...
用bootstrap搭建侧边栏
要注意: 标签的id"v-pills-dataset1-tab"要和跳转内容的aria-labelledby"v-pills-dataset1-tab"一致 标签的aria-controls"v-pills-dataset1"要和跳转内容的id"v-pills-dataset1"一致 <!-- 左边的列(侧边栏…...
手眼标定工具操作文档
1.手眼标定原理介绍 术语介绍 手眼标定:为了获取相机与机器人坐标系之间得位姿转换关系,需要对相机和机器人坐标系进行标定,该标定过程成为手眼标定,用于存储这一组转换关系的文件称为手眼标定文件。 ETH:即Eye To …...
巧记斜边函数hypot
hypot是一个数学函数,源于英文"hypotenuse(斜边)",hypot(a, b)返回直角边边长为a、b的直角三角形(right-angled triangle)的斜边长度。该函数定义在<math.h>头文件中,其功能相当…...
STM32单片机芯片与内部33 ADC 单通道连续DMA
目录 一、ADC DMA配置——标准库 1、ADC配置 2、DMA配置 二、ADC DMA配置——HAL库 1、ADC配置 2、DMA配置 三、用户侧 1、DMA开关 (1)、标准库 (2)、HAL库 2、DMA乒乓 (1)、标准库 ÿ…...
【程序人生】掌握一门编程语言
掌握一门编程语言不仅仅是能够编写正确的语法,它还涉及到对语言特性、工具链、最佳实践以及解决问题的能力有深入的理解。以下是衡量你是否掌握了某门编程语言的关键指标: 语法与基本概念 语法熟悉度:能够在不查阅文档的情况下写出正确的代码…...
数据库发生了死锁怎么办
当项目中存在公共的数据表,比如日志表,同时存在对这张表的读写操作,或者是对数据量较大的表加索引同时伴随其他并发操作,那么这张表就有较高概率发生死锁。 现象:对于这张表的任何操作都会被阻塞,项目出现…...
传递函数的幅值在0到1之间
为什么所有传递函数的幅值应该在 0 到 1 之间 在声学、振动学和信号处理等领域,传递函数的幅值表示系统对输入信号的响应幅度。在许多声学实验中,传递函数的幅值反映了声波的传输或反射特性。理论上,所有传递函数的幅值应当在 0 到 1 之间&a…...
[Unity Shader]【图形渲染】 数学基础4 - 矩阵定义和矩阵运算详解
矩阵是计算机图形学中的重要数学工具,尤其在Shader编程中,它被广泛用于坐标变换、投影变换和模型动画等场景。本文将详细介绍矩阵的定义、基本运算以及如何在Shader中应用矩阵,为初学者打下坚实的数学基础。 一、什么是矩阵? 矩阵是一个由数字排列成的长方形数组,通常记作…...
蓝桥杯练习生第四天
小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。 小蓝跑步已经坚持了很长时间&#x…...
Jmeter压测实战:Jmeter二次开发之自定义函数
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换…...
梯度(Gradient)和 雅各比矩阵(Jacobian Matrix)的区别和联系:中英双语
雅各比矩阵与梯度:区别与联系 在数学与机器学习中,梯度(Gradient) 和 雅各比矩阵(Jacobian Matrix) 是两个核心概念。虽然它们都描述了函数的变化率,但应用场景和具体形式有所不同。本文将通过…...
[python SQLAlchemy数据库操作入门]-02.交易数据实体类建立
哈喽,大家好,我是木头左! 为了顺利地使用SQLAlchemy进行股票交易数据的处理,首先需要搭建一个合适的开发环境。这包括安装必要的软件包以及配置相关的依赖项。 安装Python及虚拟环境 下载并安装Python(推荐使用最新版)。创建一个新的虚拟环境以避免依赖冲突。python -m …...
python打包exe文件
由于用户需要,将采集数据解析成txt文件,为了方便使用,将python解析方法打包成exe文件供用户使用 安装环境 ./pip.exe install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simplepython导入需要的包 import tkinter as tk from tkin…...
C# opencvsharp 流程化-脚本化-(2)ROI
ROI ROI也是经常需要使用的方法。特别是在图像编辑中。ROI又称感兴趣的区域,但是图像是矩阵是矩形的,感兴趣的是乱八七糟的,所以还有一个Mask需要了解一下的。 public class RoiStep : IImageProcessingStep{public ImageProcessingStepType…...
【Python】基于Python的CI/CD工具链:实现自动化构建与发布
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发中,持续集成(CI)和持续交付(CD)已经成为提高开发效率和软件质量的重要实践。CI/CD流程帮助开发团队自动化构建、测试、…...
Flutter组件————Scaffold
Scaffold Scaffold 是一个基础的可视化界面结构组件,它实现了基本的Material Design布局结构。使用 Scaffold 可以快速地搭建起包含应用栏(AppBar)、内容区域(body)、抽屉菜单(Drawer)、底部导…...
2024年《网络安全事件应急指南》
在这个信息技术日新月异的时代,网络攻击手段的复杂性与日俱增,安全威胁层出不穷,给企事业单位的安全防护能力带 来了前所未有的挑战。深信服安全应急响应中心(以下简称“应急响应中心”)编写了《网络安全事件应急指南》…...
通过smem 定时检测系统内存占用情况
编写定时任务脚本 cat >> /usr/local/bin/smem.sh <<-"EOF"if [[ ! -d /var/log/smem ]];thenmkdir -p /var/log/smem fi smem -tk >> /var/log/smem/smem.log EOFchmod 755 /usr/local/bin/smem.sh配置定时任务 echo "" >> /et…...
京准电钟:电厂自控NTP时间同步服务器技术方案
京准电钟:电厂自控NTP时间同步服务器技术方案 京准电钟:电厂自控NTP时间同步服务器技术方案 随着计算机和网络通信技术的飞速发展,火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系统之间的数据交换、分析和应用…...
Face to face
1.西班牙添加5G volte 首先carrierconfig里使能 <boolean name"carrier_nr_available_bool" value"true" /> <boolean name"carrier_volte_available_bool" value"true" /> 其次 组件apn配置ims参数 2.印度j…...
C语言中的文件操作:基础与实践
欢迎来到我的:世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 目录 前言内容文件文件操作:数据库文件概述:文件的打开和关闭理解流的概念文件指针 文件的打开与关闭文件的读和写文件的顺序…...
从地铁客流讲开来:十二城日常地铁客运量特征
随着城市化进程的加速和人口的不断增长,公共交通系统在现代都市生活中扮演着日益重要的角色。地铁作为高效、环保的城市交通方式,已经成为居民日常出行不可或缺的一部分。本文聚焦于2024年10月28日至12月1日期间,对包括北上广深这四个超一线城…...
VMWare 的克隆操作
零、碎碎念 VMWare 的这个克隆操作很简单,单拎出来成贴的目的是方便后续使用。 一、操作步骤 1.1、在“源”服务器上点右键,选择“管理--克隆” 1.2、选择“虚拟机的当前状态”为基础制作克隆,如下图所示,然后点击“下一页” 1.3、…...
经济学 ppt 2 部分
前言 上一次复习经济学是好久之前了,看了第一章的 ppt ,好像重点就是谁是软件经济学之父。昨天老师讲了一下题型,20 分选择题, 20 分判断题,20 分计算题,6 6 8 三个计算题,25 分表格࿰…...
R(4.4.2)的下载与安装(Windows系统)
进入官网:https://www.r-project.org/ 首先点击CRAN链接,选择一个镜像链接地址 进入CRAN所显示页面如下: 选择China下的一个镜像站点,本文选择第一个 选择windows系统下载 点击“base” 下载: 打开下载的文件 默认中文…...
一文流:JVM精讲(多图提醒⚠️)
一文流系列是作者苦于技术知识学了-忘了,背了-忘了的苦恼,决心把技术知识的要点一笔笔✍️出来,一图图画出来,一句句讲出来,以求刻在🧠里。 该系列文章会把核心要点提炼出来,以求掌握精髓,至于其他细节,写在文章里,留待后续回忆。 目前进度请查看: :::info https:/…...
C盘下的文件夹
在Windows操作系统中,C盘通常是系统安装的盘符,其中包含了许多重要的文件夹和系统文件。以下是一些常见的文件夹:系统文件夹 Windows: 包含Windows操作系统的核心文件和组件。 Program Files: 存储大多数安装的软件程序。 Program Files (x86…...
视频直播点播平台EasyDSS与无人机技术的森林防火融合应用
随着科技的飞速发展,无人机技术以其独特的优势在各个领域得到了广泛应用,特别是在森林防火这一关键领域,EasyDSS视频平台与无人机技术的融合应用更是为传统森林防火手段带来很大的变化。 一、无人机技术在森林防火中的优势 1、快速响应与高…...
通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统
背景介绍 阿里云向量检索服务Milvus版(简称阿里云Milvus)是一款云上全托管服务,确保了了与开源Milvus的100%兼容性,并支持无缝迁移。在开源版本的基础上增强了可扩展性,能提供大规模 AI 向量数据的相似性检索服务。相…...
Unity 3D饼状图效果
一. 效果展示 二.基础类 using System.Collections; using System.Collections.Generic; using UnityEngine;public class DrawCylinder : MonoBehaviour {// 网格渲染器MeshRenderer meshRenderer;// 网格过滤器MeshFilter meshFilter;// 用来存放顶点数据List<Vector3>…...
OpenHarmony-4.HDI 框架
HDI 框架 1.HDI介绍 HDI(Hardware Device Interface,硬件设备接口)是HDF驱动框架为开发者提供的硬件规范化描述性接口,位于基础系统服务层和设备驱动层之间,是连通驱动程序和系统服务进行数据流通的桥梁,是…...
ArcGIS Pro 3.4新功能2:Spatial Analyst新特性,密度、距离、水文、太阳能、表面、区域分析
Spatial Analyst 扩展模块在 ArcGIS Pro 3.4 中引入了新功能和增强功能。此版本为您提供了用于表面和区域分析的新工具以及改进的密度和距离分析功能,多种用于水文分析的工具性能的提高,一些新的太阳能分析功能。 目录 1.密度分析 2.距离分析 3.水文…...
GitLab分支管理策略和最佳实践
分支管理是 Git 和 GitLab 中非常重要的部分,合理的分支管理可以帮助团队更高效地协作和开发。以下是一些细化的分支管理策略和最佳实践: 1. 分支命名规范 • 主分支:通常命名为 main 或 master,用于存放稳定版本的代码。 • …...
uniapp自定义树型结构数据弹窗,给默认选中的节点,禁用所有子节点
兼容H5、安卓App、微信小程序 实现逻辑:给默认选中节点的所有子节点添加一个disabled属性,以此禁用子节点。 /components/sonTreeNode/sonTreeNode.vue 封装成组件 <template><view><view :class"[item,item.is_level1?pL1:item…...
方正畅享全媒体新闻采编系统 screen.do SQL注入漏洞复现
0x01 产品简介 方正畅享全媒体新闻生产系统是以内容资产为核心的智能化融合媒体业务平台,融合了报、网、端、微、自媒体分发平台等全渠道内容。该平台由协调指挥调度、数据资源聚合、融合生产、全渠道发布、智能传播分析、融合考核等多个平台组成,贯穿新闻生产策、采、编、发…...
5G 模组 RG500Q常用AT命令
5G 模组 RG500Q常用AT命令 5G 模组 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…...
day38-SSH安全登录
机器准备 什么是SSH SSH 或 Secure Shell 协议是一种远程管理协议,允许用户通过 Internet 访问、控制和修改其远程服务器。 SSH 服务是作为未加密 Telnet 的安全替代品而创建的,它使用加密技术来确保进出远程服务器的所有通信都以加密方式进行。 SS…...
U盘出现USBC乱码文件的全面解析与恢复指南
一、乱码现象初探:USBC乱码文件的神秘面纱 在数字时代,U盘已成为我们日常生活中不可或缺的数据存储工具。然而,当U盘中的文件突然变成乱码,且文件名前缀显示为“USBC”时,这无疑给用户带来了极大的困扰。这些乱码文件…...
mac iterm2 使用 lrzsz
前言 mac os 终端不支持使用 rz sz 上传下载文件,本文提供解决方法。 mac 上安装 brew install lrzsz两个脚本 注意:/usr/local/bin/iterm2-send-zmodem.sh 中的 sz命令路径要和你mac 上 sz 命令路径一致。 /usr/local/bin/iterm2-recv-zmodem.sh 中…...