在这里插入图片描述
个人主页:ujainu

引言

随着华为鸿蒙操作系统(HarmonyOS)逐步扩展至 PC 领域,开发者生态正迎来新的机遇与挑战。尽管 HarmonyOS PC 尚未原生支持 Electron 框架,但借助其对 Linux 应用的兼容能力,我们仍可在该平台上成功运行基于 Electron 的桌面应用。

本文将围绕一个精简而功能完整的 Electron 示例,深入剖析如何在 HarmonyOS PC 上创建一个无边框、透明背景、居中显示“Hello HarmonyOS PC” 的窗口。该示例全部逻辑封装于单个 main.js 文件中,无需额外 HTML 资源,非常适合快速验证环境兼容性或构建轻量级启动界面。我们将逐层解析关键配置、API 使用及适配策略,为你提供一份详尽的技术指南。


一、整体架构与设计目标

我们的目标非常明确:

  • 窗口无系统边框(无标题栏、无关闭按钮)
  • 背景透明,仅保留内容区域可见
  • 窗口居中于主屏幕
  • 固定尺寸(400×300 像素)
  • 内容为纯前端渲染,显示“Hello HarmonyOS PC”
  • 兼容 HarmonyOS PC 的图形与运行环境

为实现上述目标,需合理使用 Electron 的 BrowserWindowscreen 等核心模块,并针对潜在的 GPU 兼容问题进行预处理。


二、关键配置解析

2.1 禁用硬件加速:提升跨平台稳定性

在 HarmonyOS PC 的早期版本中,GPU 驱动或图形合成器可能尚未完全适配 Chromium 渲染引擎。为避免黑屏、闪烁或崩溃,主动禁用硬件加速是推荐做法

Electron 提供了两种层级的禁用方式:

  • 应用层app.disableHardwareAcceleration()
    此方法在 Electron 初始化前调用,可全局关闭 GPU 渲染,强制使用 CPU 合成。

  • Chromium 层(可选):app.commandLine.appendSwitch('disable-gpu')
    直接向底层 Chromium 传递命令行参数,彻底禁用 GPU 进程。

在大多数兼容场景下,仅调用前者已足够。若遇到极端渲染异常,可启用后者作为兜底。

最佳实践:在 require 之后、app.whenReady() 之前立即调用 disableHardwareAcceleration()


2.2 获取屏幕信息并计算居中坐标

窗口居中不能依赖 BrowserWindow.center() 方法——它在某些嵌入式或容器化环境中可能失效。更可靠的方式是:

  1. 通过 screen.getPrimaryDisplay().workAreaSize 获取可用工作区尺寸(排除任务栏等系统 UI)。
  2. 手动计算窗口左上角坐标:
    x = (屏幕宽度 - 窗口宽度) / 2
    y = (屏幕高度 - 窗口高度) / 2
    

这种方式确保窗口始终精准居中,且不被系统栏遮挡。


2.3 BrowserWindow 核心选项说明

创建窗口时,以下配置至关重要:

配置项 作用
frame false 移除操作系统原生窗口边框,实现“无铬”设计
transparent true 启用透明背景,允许 CSS 渐变或半透明效果穿透
resizable false 锁定窗口尺寸,适用于固定内容场景
skipTaskbar false 保留在任务栏显示,便于用户切换

⚠️ 注意:transparent: true 要求操作系统支持 Alpha 通道合成。HarmonyOS PC 基于现代图形栈(如增强版 X11 或 Wayland),通常满足此条件。


2.4 动态内联 HTML 内容

为简化项目结构,我们直接在 JavaScript 中定义 HTML 字符串,并通过 data: URL 协议加载:

mainWindow.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(htmlContent));

优势包括:

  • 无需维护外部 index.html 文件
  • 适合小型提示窗、启动页等场景
  • 减少文件 I/O,提升加载速度

同时,通过 encodeURIComponent 确保 HTML 中的特殊字符(如 <, >, &)被正确转义,防止解析错误。

CSS 部分采用 Flexbox 实现内容绝对居中,并使用 linear-gradient 创建视觉层次感,无需图片资源。


三、HarmonyOS PC 适配注意事项

3.1 运行前提

  • 设备需开启 开发者模式 并启用 Linux 兼容环境(如 Huawei’s Linux Runtime for PC)。
  • 终端中可正常执行 node -vnpm install electron
  • 图形子系统支持透明窗口合成(HarmonyOS 默认支持)。

3.2 性能与安全建议

  • 内存占用:Electron 应用基础内存约 100–150MB,若设备资源有限,应避免多实例运行。
  • 安全性:本示例未启用 nodeIntegration,符合安全最佳实践。若需主/渲染进程通信,应使用 preload 脚本 + IPC。
  • 长期演进:华为官方推荐使用 ArkTS + Stage 模型 开发原生 HarmonyOS 应用。Electron 可作为过渡方案,但非最终形态。

四、扩展与优化方向

当前代码虽简洁,但具备良好扩展性:

  1. 添加关闭交互:可通过双击、右键菜单或快捷键触发 app.quit()
  2. 集成系统托盘:利用已导入的 TrayMenu 模块,实现后台常驻。
  3. 响应 DPI 缩放:读取 screen.getPrimaryDisplay().scaleFactor 动态调整窗口尺寸。
  4. 支持多显示器:遍历 screen.getAllDisplays() 选择最佳显示设备。

完整代码(main.js)

const { app, BrowserWindow, Tray, nativeImage, Menu, screen } = require('electron');
const path = require('path');

let mainWindow, tray;

// 1. 在 Electron 层面禁用硬件加速
app.disableHardwareAcceleration();
// 2. 在 Chromium 层面追加命令行开关,彻底禁用 GPU
// app.commandLine.appendSwitch('disable-gpu');

function createWindow() {
    // 获取屏幕尺寸
    const { width: screenWidth, height: screenHeight } = screen.getPrimaryDisplay().workAreaSize;

    // 窗口尺寸
    const windowWidth = 400;
    const windowHeight = 300;

    // 计算居中位置
    const x = (screenWidth - windowWidth) / 2;
    const y = (screenHeight - windowHeight) / 2;

    mainWindow = new BrowserWindow({
        width: windowWidth,
        height: windowHeight,
        x: x,
        y: y,
        frame: false, // 无边框
        transparent: true, // 透明背景
        resizable: false,
        skipTaskbar: false,
    });

    // 创建 HTML 内容
    const htmlContent = `
        <!DOCTYPE html>
        <html>
        <head>
            <style>
                body {
                    margin: 0;
                    padding: 0;
                    display: flex;
                    justify-content: center;
                    align-items: center;
                    height: 100vh;
                    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
                    font-family: 'Arial', sans-serif;
                    overflow: hidden;
                }
                h1 {
                    color: white;
                    font-size: 32px;
                    text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
                    margin: 0;
                }
            </style>
        </head>
        <body>
            <h1>Hello HarmonyOS PC</h1>
        </body>
        </html>
    `;

    mainWindow.loadURL('data:text/html;charset=utf-8,' + encodeURIComponent(htmlContent));
}

app.whenReady().then(createWindow);

运行界面:
在这里插入图片描述

结语

本文通过深入剖析一段高度凝练的 Electron 代码,展示了如何在 HarmonyOS PC 上高效构建现代化桌面窗口。从禁用硬件加速到透明无边框设计,每一步都兼顾了功能性、兼容性与用户体验。

尽管 Electron 并非 HarmonyOS 的原生技术栈,但在生态建设初期,它为 Web 开发者提供了一条低摩擦的迁移路径。掌握其在新平台上的运行机制,不仅有助于当前项目落地,也为未来向 ArkUI 等原生框架平滑过渡奠定基础。


欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐