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++)確認準確的類名。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63647.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【1.排序】

排序 筆記記錄 1.排序的基本概念1.1 排序的定義 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希爾排序 3. 交換排序3.1 冒泡排序3.2 快速排序 4. 選擇排序4.1 簡單選擇排序4.2 堆排序 5. 歸并排序、基數排序和計數排序5.1 歸并排序4.2 基數排序4.3 計數排序 6. 各種內部排…

Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon

文章目錄 Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon什么是 Swap&#xff1f;主要命令介紹1. mkswap2. mkfs.swap3. swapon 創建和管理 Swap 的步驟1. 創建 Swap 分區2. 初始化 Swap3. 激活 Swap4. 持久化配置5. 查看 Swap 狀態 刪除 Swap 分區或文件1. 停用 Swap2. 刪…

取子串(指針)

#include <stdio.h> #include <string.h>char* substr(char *s, int startloc, int len) {static char result[51]; // 定義一個足夠大的靜態數組來存儲結果static char result1[] {N,U,L,L,\0};int i, j;// 檢查startloc是否在字符串的范圍內if (startloc < 1…

「Mac暢玩鴻蒙與硬件45」UI互動應用篇22 - 評分統計工具

本篇將帶你實現一個評分統計工具&#xff0c;用戶可以對多個選項進行評分。應用會實時更新每個選項的評分結果&#xff0c;并統計平均分。這一功能適合用于問卷調查或評分統計的場景。 關鍵詞 UI互動應用評分統計狀態管理數據處理多目標評分 一、功能說明 評分統計工具允許用…

類與對象的理解

面向對象中兩個重要的概念&#xff1a;類與對象 類 簡單理解&#xff0c;它指的是類型或者分類或某個模塊 比如&#xff1a;人類、動物類……&#xff1b;入公司的入職單&#xff0c;沒寫上任何人的情況下 對象 簡單理解&#xff0c;它指的具體的個體 備注&#xff1a;對…

遞歸實現指數型枚舉(遞歸)

92. 遞歸實現指數型枚舉 - AcWing題庫 每個數有選和不選兩種情況 我們把每個數看成每層&#xff0c;可以畫出一個遞歸搜索樹 葉子節點就是我們的答案 很容易寫出每dfs函數 dfs傳入一個u表示層數 當層數大于我們n時&#xff0c;去判斷每個數字的選擇情況&#xff0c;輸出被選…

Linux相關概念和易錯知識點(25)(信號原理、操作系統的原理、volatile)

目錄 1.信號的產生 &#xff08;1&#xff09;kill &#xff08;2&#xff09;raise、abort 2.對block、pending、handler表的管理 &#xff08;1&#xff09;信號集&#xff08;sigset_t&#xff09; &#xff08;2&#xff09;block表的管理 ①操作相關的函數 ②sigpr…

opencv中的色彩空間及其轉換

在 OpenCV 中&#xff0c;色彩空間&#xff08;Color Space&#xff09;指的是表示顏色的一種方式&#xff0c;或是用數學模型對顏色的表達。不同的色彩空間采用不同的方式來描述顏色的三要素&#xff08;如亮度、飽和度、色調&#xff09;&#xff0c;因此可以在不同的應用場景…

OPPO 數據分析面試題及參考答案

如何設計共享單車數據庫的各個字段? 對于共享單車的數據庫設計,首先考慮用戶相關的字段。用戶表可以包含用戶 ID,這是一個唯一標識符,用于區分不同用戶;姓名,記錄用戶的真實姓名;聯系方式,比如手機號碼,方便在出現問題時聯系用戶;注冊時間,記錄用戶何時開始使用共享…

在Ubuntu下運行QEMU仿真FreeBSD riscv64系統

在Ubuntu下運行QEMU仿真FreeBSD riscv64系統 突發奇想&#xff0c;嘗試在Ubuntu下運行QEMU仿真FreeBSD riscv64系統&#xff0c; 參考這篇文檔&#xff1a;手把手教你在QEMU上運行RISC-V Linux_qemu 運行 .bin-CSDN博客 并參考FreeBSD的Wiki&#xff1a;riscv - FreeBSD Wik…

大模型微調---Prompt-tuning微調

目錄 一、前言二、Prompt-tuning實戰2.1、下載模型到本地2.2、加載模型與數據集2.3、處理數據2.4、Prompt-tuning微調2.5、訓練參數配置2.6、開始訓練 三、模型評估四、完整訓練代碼 一、前言 Prompt-tuning通過修改輸入文本的提示&#xff08;Prompt&#xff09;來引導模型生…

Visual Studio 、 MSBuild 、 Roslyn 、 .NET Runtime、SDK Tools之間的關系

1. Visual Studio Visual Studio 是一個集成開發環境&#xff08;IDE&#xff09;&#xff0c;為開發者提供代碼編寫、調試、測試和發布等功能。它內置了 MSBuild、Roslyn 和 SDK Tools&#xff0c;并提供圖形化界面來方便開發者進行項目管理和構建。與其他組件的關系&#xf…

Winnows基礎(2)

Target 了解常見端口及服務&#xff0c;熟練cmd命令&#xff0c;編寫簡單的 .bat 病毒程序。 Trail 常見服務及端口 80 web 80-89 可能是web 443 ssl心臟滴血漏洞以及一些web漏洞測試 445 smb 1433 mssql 1521 oracle 2082/2083 cpanel主機管理系統登陸&#xff08;國外用的…

Edge Scdn用起來怎么樣?

Edge Scdn&#xff1a;提升網站安全與性能的最佳選擇 在當今互聯網高速發展的時代&#xff0c;各種網絡攻擊層出不窮&#xff0c;特別是針對網站的DDoS攻擊威脅&#xff0c;幾乎每個行業都可能成為目標。為了確保網站的安全性與穩定性&#xff0c;越來越多的企業開始關注Edge …

通信技術以及5G和AI保障電網安全與網絡安全

摘 要&#xff1a;電網安全是電力的基礎&#xff0c;隨著智能電網的快速發展&#xff0c;越來越多的ICT信息通信技術被應用到電力網絡。本文分析了歷史上一些重大電網安全與網絡安全事故&#xff0c;介紹了電網安全與網絡安全、通信技術與電網安全的關系以及相應的電網安全標準…

梯度(Gradient)和 雅各比矩陣(Jacobian Matrix)的區別和聯系:中英雙語

雅各比矩陣與梯度&#xff1a;區別與聯系 在數學與機器學習中&#xff0c;梯度&#xff08;Gradient&#xff09; 和 雅各比矩陣&#xff08;Jacobian Matrix&#xff09; 是兩個核心概念。雖然它們都描述了函數的變化率&#xff0c;但應用場景和具體形式有所不同。本文將通過…

時間序列預測論文閱讀和相關代碼庫

時間序列預測論文閱讀和相關代碼庫列表 MLP-based的時間序列預測資料DLinearUnetTSFPDMLPLightTS 代碼庫以及論文庫&#xff1a;Time-Series-LibraryUnetTSFLightTS MLP-based的時間序列預測資料 我會定期把我的所有時間序列預測論文有關的資料鏈接全部同步到這個文章中&#…

引言和相關工作的區別

引言和相關工作的區別 引言 目的與重點 引言主要是為了引出研究的主題,向讀者介紹為什么這個研究問題是重要且值得關注的。它通常從更廣泛的背景出發,闡述研究領域的現狀、面臨的問題或挑戰,然后逐漸聚焦到論文要解決的具體問題上。例如,在這篇關于聯邦學習數據交易方案的…

GitLab分支管理策略和最佳實踐

分支管理是 Git 和 GitLab 中非常重要的部分&#xff0c;合理的分支管理可以幫助團隊更高效地協作和開發。以下是一些細化的分支管理策略和最佳實踐&#xff1a; 1. 分支命名規范 ? 主分支&#xff1a;通常命名為 main 或 master&#xff0c;用于存放穩定版本的代碼。 ? …

批量提取zotero的論文構建知識庫做問答的大模型(可選)——含轉存PDF-分割統計PDF等

文章目錄 提取zotero的PDF上傳到AI平臺保留文件名代碼分成20個PDF視頻講解 提取zotero的PDF 右鍵查看目錄 發現目錄為 C:\Users\89735\Zotero\storage 寫代碼: 掃描路徑‘C:\Users\89735\Zotero\storage’下面的所有PDF文件,全部復制一份匯總到"C:\Users\89735\Downl…