HarmonyOS 鸿蒙Next中PC应用如何创建任务栏托盘图标,以及启动时隐藏窗口?

HarmonyOS 鸿蒙Next中PC应用如何创建任务栏托盘图标,以及启动时隐藏窗口? 就是应用启动时直接在后台启动,不显示窗口。

另外,有没有办法让应用在显示窗口时不在任务栏显示图标?

如果能有个demo就更好了。

7 回复

尊敬的开发者,您好,

当前暂不支持直接点击图标启动应用时不显示主窗的能力,若开发者需要此功能,为了尽快响应您的诉求,请帮忙补充以下信息,感谢:

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

更多关于HarmonyOS 鸿蒙Next中PC应用如何创建任务栏托盘图标,以及启动时隐藏窗口?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


  • 在 module.json5中声明 ExtensionAbility,类型为 “tray”。
  • 创建一个继承 TrayExtensionAbility 的类,实现关键回调。
{
  "extensionAbilities": [
    {
      "name": "MyTrayExtension",
      "type": "tray",
      "srcEntry": "./ets/MyTrayExtension.ets"
    }
  ]
}

TrayExtension.ets

import TrayExtensionAbility from '[@ohos](/user/ohos).application.TrayExtensionAbility';

export default class MyTray extends TrayExtensionAbility {
  onCreateTrayMenu() {
    // 返回菜单项数组
    return [
      { id: 1, text: "显示窗口", icon: "$media:show_icon" },
      { id: 2, text: "退出", icon: "$media:exit_icon" }
    ];
  }

  onTrayMenuItemClick(item: any) {
    if (item.id === 1) {
      // 显示主窗口逻辑
      this.showMainWindow();
    } else if (item.id === 2) {
      this.terminateSelf(); // 退出应用
    }
  }

  updateTrayIcon(iconPath?: string) {
    // 更新托盘图标
  }

  // 自定义显示窗口方法(需结合 WindowStage)
  private showMainWindow() {
    // 通过 WindowManager 或 AbilityContext 获取并显示窗口
  }
}

托盘图标通常与应用的 Extension 结合使用,支持点击菜单、图标更新等。系统可能会自动添加“退出”菜单项,开发者需在逻辑中统一处理退出事件。

启动时直接后台运行(隐藏主窗口)

应用启动时不显示主窗口,实现“后台驻留”:

  • UIAbility 的生命周期中处理窗口:
    • 在 onWindowStageCreate 中获取主窗口后立即隐藏/最小化。
    • 使用 Window API 设置可见性或状态。
    • @ohos.window中mainWindow.minimize()

EntryAbility.ets

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.WindowKit';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    // 获取主窗口
    windowStage.getMainWindow().then((mainWin: window.Window) => {
      // 启动时立即隐藏主窗口(后台运行)
      mainWin.hide();  // 或 mainWin.minimize();
      
      // 可选:设置窗口标志,确保最小化时隐藏到托盘
      // mainWin.setWindowFlags(...);
      
      // 初始化托盘
      this.initTray();
    }).catch(err => {
      console.error('获取窗口失败', err);
    });
  }

  private initTray() {
    // 触发 TrayExtensionAbility 或相关逻辑
  }

  // 提供显示窗口的方法,供托盘菜单调用
  showWindow() {
    // 通过 WindowStage 或 AbilityContext 显示
  }
}

PC 端这几个能力要分开看:托盘/状态栏入口、启动不显示主窗口、任务栏是否显示图标,不是同一个开关。

托盘类入口优先看 PC 桌面相关能力里的 statusBar/statusBarManager;普通 @ohos.window 更偏应用窗口管理,不能把任意窗口直接变成系统托盘。启动隐藏窗口则要看应用启动流程里是否可以先不 show 主窗口,或启动后立即最小化/隐藏,并通过托盘入口再恢复。

“窗口显示但不在任务栏显示图标”通常受系统窗口类型和应用权限限制,普通三方应用未必能完全控制。建议先用官方 PC 桌面扩展 Demo 跑通状态栏图标,再接自己的窗口显示/隐藏逻辑。

PC 端需要分开看:

  1. 类似“托盘/状态栏图标”的入口,不是 @ohos.window 里的普通任务栏属性。PC 桌面能力里可以使用 DesktopExtensionKit 的 statusBarManager 添加状态栏图标,例如通过 statusBarManager.addToStatusBar(context, statusBarItem) 配置图标、悬浮提示、左键快捷操作、右键菜单,并监听 statusBarIconClick / rightMenuClick。该能力依赖设备支持 SystemCapability.PCService.StatusBarManager。需要 QuickBar 任务入口时,可再看 quickBarManager.addQuickTask / addQuickBarGroup。

  2. 应用启动后直接退到后台,普通 UIAbility 可在合适时机调用 UIAbilityContext.moveAbilityToBackground()。注意它要求 Ability 当前在前台,且不支持的场景会返回 Operation not supported。

  3. 如果要隐藏/显示一个挂在状态栏项上的 Ability,可用 UIAbilityContext.hideAbility() / showAbility(),但前提是该 Ability 是通过 startAbility 启动,并且 StartOptions 同时设置 processMode 与 startupVisibility,其中 processMode 使用 NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM 或 ATTACH_TO_STATUS_BAR_ITEM,且调用方已先添加状态栏项。不满足这些条件会报 StartOptions 校验失败或 Capability not support。

  4. “显示窗口但不在任务栏显示图标”目前不建议按普通 Window 属性处理,公开窗口 API 里没有一个通用开关可以直接隐藏任务栏图标。若目标是常驻后台入口,应按 PC 状态栏/QuickBar 扩展能力设计。

插眼,

在 HarmonyOS NEXT 中,PC 应用可通过 application 组件配合 WindowStage 实现。创建托盘图标需使用 SystemTray 能力(@ohos.systemTray),调用 createTrayIcon() 并绑定 click 事件。启动时隐藏窗口:在 onWindowStageCreate 中获取主窗口 windowStage.getMainWindow(),调用 window.hide(),并设置 WindowModeFULLSCREEN 或不显示。需在 module.json5 中申请 ohos.permission.SYSTEM_TRAY 权限。注意使用 ArkTS/ArkUI,非 Java/C。

在HarmonyOS NEXT PC应用中,可使用 @ohos.systemTray 创建任务栏托盘图标,并在启动时通过窗口隐藏接口实现后台运行。

1. 创建托盘图标
在UIAbility中初始化系统托盘:

import systemTray from '@ohos.systemTray';
import { BusinessError } from '@ohos.base';

// 创建托盘
systemTray.createTray(context, (err, tray) => {
  if (err) return;
  // 设置图标和提示文本
  tray.setIcon(iconPixelMap, (err) => {});
  tray.setLabel('应用名称', (err) => {});
  // 点击托盘图标时显示主窗口
  tray.on('click', () => {
    window.getLastWindow(context).then(win => win.show());
  });
});

2. 启动时隐藏窗口
在UIAbility的onWindowStageCreate中,加载页面后将主窗口设为不可见:

onWindowStageCreate(windowStage: window.WindowStage) {
  windowStage.loadContent('pages/Index', (err) => {
    if (!err) {
      const mainWin = windowStage.getMainWindowSync();
      mainWin.setWindowVisibility(false, (err) => {});
    }
  });
}

3. 关于“显示窗口时不在任务栏显示图标”
目前HarmonyOS公开API不支持直接控制任务栏图标的显隐。若需实现,可考虑将显示窗口创建为工具窗口(windowStage.createSubWindow)而非主窗口,但该方式会有其他限制。建议优先使用托盘方案,隐藏主窗口即可避免任务栏图标。

回到顶部