当前位置: 首页 > news >正文

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在后台处理任务),以下是实现步骤和完整代码:

步骤:

  1. 在 Electron 中,我们可以使用 Node.js 和 koffi 来调用 Win32 API。
  2. 在 Electron 的主进程中处理 Photoshop 窗口的显示与隐藏。
  3. 在渲染进程中使用 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')
});

代码说明:

  1. 主进程(main.js):
    • createWindow 用于创建并加载应用程序的窗口。
    • 使用 ipcMain.handle 来处理渲染进程发来的请求(这里是切换 Photoshop 窗口显示与隐藏)。
    • 通过 koffi 库加载 user32.dll,使用 FindWindowA(windows官网文档) 查找 Photoshop 窗口的句柄,使用 ShowWindow 切换窗口的显示与隐藏状态。
  2. 渲染进程(index.html):
    • 页面中有一个按钮,点击按钮后触发 togglePhotoshop 方法,向主进程请求切换 Photoshop 窗口的显示状态。
    • 使用 ipcRenderer 向主进程发送请求。
  3. Preload 脚本(preload.js):
    • 通过 contextBridge 暴露了 togglePhotoshop 方法给渲染进程,使渲染进程可以调用主进程的方法。
  4. koffi 调用:
    • FindWindowA 查找 Photoshop 窗口。
    • ShowWindow 切换 Photoshop 窗口的显示/隐藏状态。
    • IsWindowVisible 用来判断 Photoshop 当前是否可见。

代码运行:

  1. 确保你已经安装了 Electron 和 koffi 模块:
npm install electron koffi
  1. 运行 Electron 应用:
npx electron .
  1. 打开应用,点击按钮切换 Photoshop 窗口的显示和隐藏。

注意事项:
• 权限:确保你以管理员权限运行 Electron,这样才能操作系统窗口。
• Photoshop 类名:默认情况下,Photoshop 的类名是 “Photoshop”,如果不行,可能需要通过工具(如 Spy++)确认准确的类名。

相关文章:

Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)

electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…...

谷歌浏览器 安装谷歌浏览器特定版本后禁止自动更新

问题描述 我们通过离线安装谷歌浏览器后&#xff0c;第一次打开浏览器时会默认下载最新版本&#xff0c;等到我们重启浏览器后它会自动更新。在项目中为了能固定浏览器版本&#xff0c;所以要禁止谷歌浏览器的更新&#xff0c;网上找了好多方法都没用&#xff0c;自己摸索出来…...

Linux计算时间差

Linux计算时间差 1、Linux计算时间差2、时间差的应用 1、Linux计算时间差 在Linux中&#xff0c;计算时间差通常是为了统计、监控或调试。时间差可以用来衡量任务执行的时间&#xff0c;或者两个事件之间的间隔。例如&#xff0c;响应时间、执行时间、定时任务与延时处理等 以…...

Python的3D可视化库【vedo】2-5 (plotter模块) 坐标转换、场景导出、添加控件

文章目录 4 Plotter类的方法4.7 屏幕和场景中的坐标点转换4.7.1 屏幕坐标转为世界坐标4.7.2 世界坐标转为屏幕坐标4.7.3 屏幕坐标取颜色 4.8 导出4.8.1 导出2D图片4.8.2 导出3D文件 4.9 添加控件4.9.1 添加内嵌子窗口4.9.2 添加选择区4.9.3 添加比例尺4.9.4 为对象添加弹出提示…...

【VUE】13、安装nrm管理多个npm源

nrm&#xff08;npm registry manager&#xff09;是一个 npm 源管理器&#xff0c;它允许用户快速地在不同的 npm 源之间进行切换&#xff0c;以提高包管理的速度和效率。以下是对 nrm 使用的详细介绍&#xff1a; 1、安装nrm 在使用 nrm 之前&#xff0c;需要先确保已经安装…...

【SQL/MySQL 如何使用三种触发器】SQL语句实例演示

触发器介绍 – 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义的SQL语句集合。 – 使用别名OLD和NEW来引用触发器中发生变化的记录内容&#xff0c;这与其他的数据库是相似的。现在触发器还只…...

Docker容器五种网络驱动模式详解

Docker 网络用于在容器之间以及容器与外部网络之间提供通信功能。它允许容器在隔离的网络环境中运行&#xff0c;同时也能根据需要与其他容器或外部网络进行交互。通过使用网络驱动&#xff0c;Docker 可以创建不同类型的网络&#xff0c;以满足各种应用场景的需求。 传统上&am…...

netfilter简介及流程图

Netfilter 是 Linux 内核中用于网络包过滤和操作的框架&#xff0c;由 Rusty Russell 于1998年创立&#xff0c;旨在改进旧的 ipchains 和 ipfwadm 实现。它采用模块化设计&#xff0c;具有良好可扩展性&#xff0c;并在2000年3月合并进Linux 2.3.x内核版本。 Netfilter的主要…...

Vue 前端代码规范

在 Vue 前端开发中&#xff0c;遵循代码规范可以提高代码的可读性、可维护性和团队协作效率。以下是一些详细的 Vue 前端代码规范&#xff0c;涵盖了多个方面&#xff1a; ### 1. **项目结构** - **目录结构**:- src/ 目录下应包含 components/、views/、store/、router/、ass…...

JAVA:组合模式(Composite Pattern)的技术指南

1、简述 组合模式(Composite Pattern)是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它使客户端对单个对象和组合对象的使用具有一致性。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什么是组合模式 组合模式…...

js常用方法之: 预览大图(uniapp原生方法封装)

方法: //预览图片 pic可传单个图片地址字符串 或 图片数组(带index) previewPic: function(pic, index) {if (!pic) return;if (index undefined) {let array [];array.push(pic);uni.previewImage({urls: array,current: array[0]});} else {uni.previewImage({urls: pic,…...

python 高级用法

1、推导列表 ans [ x for x in range(6)] print(ans)ans [ x for x in range(6) if x > 2] print(ans)ans [ x*y for x in range(6) if x > 2 for y in range(6) if y < 3] print(ans) 2、map 函数 a list(map(list,"abc")) print(a) b list(map(ch…...

TISAX认证最新消息

一、TISAX认证概述 TISAX&#xff08;Trusted Information Security Assessment Exchange&#xff09;认证是由德国汽车工业协会&#xff08;VDA&#xff09;主导开发的一种信息安全评估标准。该认证旨在确保汽车供应链中的信息安全&#xff0c;帮助汽车产业链中的企业保护其敏…...

Python中所有子图标签Legend显示详解

在数据可视化中&#xff0c;图例&#xff08;legend&#xff09;是一个非常重要的元素&#xff0c;它能够帮助读者理解图表中不同元素的含义。特别是在使用Python进行可视化时&#xff0c;matplotlib库是一个非常强大的工具&#xff0c;能够轻松创建包含多个子图的图表&#xf…...

python脚本中使用git命令

python脚本中使用git命令 一、背景 在做项目输入文件的版本管理的时候,我发现我需要用到库上面的文件来作为版本管理比较的输入,通常情况下,我是先根据tag将两个版本的文件拉取到本地,然后放进我的工程里在运行脚本来完成版本的比较,但是我发现这样其实很麻烦,所以就想着…...

本地maven项目打包部署到maven远程私库

目的&#xff1a;在自己的maven项目中&#xff0c;要把当前maven项目部署到maven私库&#xff0c;供其他人引入依赖使用。 首先要确保你当前能访问到你的私库&#xff0c;能拉私库的maven依赖即可。 maven部署命令&#xff1a; mvn deploy:deploy-file -Dmaven.test.skiptrue -…...

自己搭建专属AI:Llama大模型私有化部署

前言 AI新时代&#xff0c;提高了生产力且能帮助用户快速解答问题&#xff0c;现在用的比较多的是Openai、Claude&#xff0c;为了保证个人隐私数据&#xff0c;所以尝试本地&#xff08;Mac M3&#xff09;搭建Llama模型进行沟通。 Gpt4all 安装比较简单&#xff0c;根据 G…...

[免费]SpringBoot公司财务管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBoot公司财务管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBoot公司财务管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息化技术&…...

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…...

【YOLO 项目实战】(11)YOLO8 数据集与模型训练

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO 项目实战】&#xff08;1&#xff09;YOLO5 环境配置与检测 【YOLO 项目实战】&#xff08;10&#xff09;YOLO8 环境配置与推理检测 【YOLO 项目实战】&#xff08;11&#xff09;YOLO8 数据…...

机器人抓取仿真与数据分析:从PyBullet集成到抓取性能评估

1. 项目概述与核心价值最近在机器人控制与仿真领域&#xff0c;一个名为PyroMind-Dynamics/openclaw-tracer的项目引起了我的注意。乍一看这个标题&#xff0c;它像是一个典型的GitHub仓库名&#xff0c;由组织名“PyroMind-Dynamics”和项目名“openclaw-tracer”组成。作为一…...

Nintendo Switch大气层破解系统终极指南:从入门到精通完整教程

Nintendo Switch大气层破解系统终极指南&#xff1a;从入门到精通完整教程 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层整合包系统是为Nintendo Switch设备提供的一站式定制化固件…...

跨设备可用!北大提出UniMM-HAR数据集:补齐毫米波雷达人体运动分析实用短板!

点击下方卡片&#xff0c;关注“CVer”公众号AI/CV重磅干货&#xff0c;第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号&#xff1a;CVer2233&#xff0c;小助手拉你进群&#xff01;扫描下方二维码&#xff0c;加入CVer学术星球&#xff01;可以获得最新顶会/顶…...

ADF4350实战排坑:从时序错乱到电源噪声的锁定之路

1. ADF4350调试初体验&#xff1a;从"无法锁定"的绝望到曙光 第一次拿到ADF4350这颗宽带频率合成器芯片时&#xff0c;我和大多数新手工程师一样信心满满——毕竟官方提供了详尽的datasheet和参考设计。但现实很快给了我们当头一棒&#xff1a;无论怎么配置寄存器&a…...

从零上手Ranorex:录制、验证与参数化测试实战解析

1. Ranorex自动化测试入门指南 第一次接触Ranorex时&#xff0c;我和大多数测试工程师一样&#xff0c;被它强大的功能所震撼。作为一款专业的自动化测试工具&#xff0c;Ranorex能够显著提升测试效率&#xff0c;特别适合需要频繁回归测试的项目场景。记得我第一次用它完成计算…...

基于RAG的德国开放数据智能问答助手:从原理到工程实践

1. 项目概述&#xff1a;当德国开放数据遇上GPT最近在折腾一个挺有意思的项目&#xff0c;叫 OpenDataGermanyGPT。光看名字&#xff0c;你可能觉得这又是一个“GPT套壳”应用&#xff0c;但实际玩下来&#xff0c;我发现它的核心价值远不止于此。简单来说&#xff0c;这是一个…...

如何快速掌握Spinning Up超参数调优:提升深度强化学习性能的终极指南

如何快速掌握Spinning Up超参数调优&#xff1a;提升深度强化学习性能的终极指南 【免费下载链接】spinningup An educational resource to help anyone learn deep reinforcement learning. 项目地址: https://gitcode.com/gh_mirrors/sp/spinningup Spinning Up是一款…...

2026质量管控新趋势 FMEA避坑指南+六西格玛落地技巧

当下质量管控领域&#xff0c;“FMEA走过场”成为行业痛点&#xff0c;尤其在2026年第六届FMEA峰会后&#xff0c;这一话题持续升温&#xff0c;登上科技类热搜。不少技术从业者反馈&#xff0c;企业花大量时间填写FMEA表格&#xff0c;却依然挡不住现场故障频发&#xff0c;沦…...

人工神经网络知识点讲解

人工神经网络知识点讲解 知识导图 人工神经网络 ├── 基础认知 │ ├── 神经网络的核心概念 │ ├── 神经元的工作机制 │ └── 网络的层级结构 ├── 激活函数 │ ├── 激活函数的作用 │ ├── 常见激活函数&#xff1a;sigmoid/tanh/ReLU/Softmax │ …...

GNU Board G6开源社区引擎:PHP+MySQL架构部署与深度定制指南

1. 项目概述&#xff1a;一个被低估的社区引擎如果你在寻找一个能快速搭建社区、论坛或者内容管理系统的开源方案&#xff0c;并且对PHP和MySQL环境比较熟悉&#xff0c;那么gnuboard/g6这个名字可能值得你花点时间了解一下。它不是那种铺天盖地宣传的明星项目&#xff0c;但在…...