Skip to content

窗口管理

概述

cloudWindow 用于管理窗口自身,提供相关api用于管理、获取窗口状态、通信等。

引入使用

ts
import cloudWindow from '@ugreen-nas/core/cloudWindow'

窗口通信概念

消息

通过 send / sendTo 发送,对应窗口通过 cloudWindow.listenWindowData 接收。所有消息、事件均可在回调内知晓来源。

注意:使用 send(data, event)sendTo(winId, data, event) 等形式携带自定义事件名时,事件名不能与框架内置窗口事件名相同(如 load-finishclosefocus 等该文档所列举出的事件),否则 Promise 会被拒绝并抛出错误。

事件

ts
cloudWindow.on('xxx', (data, from) => {
  // data:事件数据
  // from:数据来源
})

事件

使用 cloudWindowMgr.create() 创建的窗口对象具有以下事件。

load-finish

当窗口加载成功时触发。

回调参数

参数名类型说明
urlstring加载的 URL

load-error

当窗口加载失败时触发。

回调参数

参数名类型说明
urlstring加载失败的 URL

focus

当窗口获得焦点时触发。

说明:该事件无回调数据。

blur

当窗口失去焦点时触发。

说明:该事件无回调数据。

move

当窗口移动到新位置时触发(移动结束)。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度

moving

当窗口正在移动时触发(移动过程中持续触发)。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度

resizing

当窗口正在调整大小时触发(拖拽调整过程中持续触发)。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度

resize

当窗口调整完大小时触发。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度

maximize

当窗口最大化时触发。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度

un-maximize

当窗口退出最大化时触发。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度

minimize

当窗口最小化时触发。

说明:该事件无回调数据。

restore

当窗口从最小化状态恢复时触发。

说明:该事件无回调数据。

close

窗口关闭后触发,无法阻止。

回调参数

参数名类型说明
data{ fake: boolean }fake === true 表示假关闭(隐藏),false 表示真正关闭/销毁

before-close

窗口关闭前触发,支持 preventDefault() 阻止关闭。

回调参数

参数名类型说明
eEvent原生事件对象,调用 e.preventDefault() 可阻止关闭

hostChange

当请求的 BaseUrl 发生改变时触发(如设备地址切换)。

回调参数

参数名类型说明
dataany变更相关信息(如新 URL 等)

always-on-top-changed

窗口的置顶状态变更时触发。

回调参数

参数名类型说明
valueboolean当前置顶状态

mouse-enter

鼠标移入窗口时触发。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度
topboolean窗口是否置顶

mouse-leave

鼠标移出窗口时触发。

回调参数

参数名类型说明
xnumber窗口 x 坐标
ynumber窗口 y 坐标
widthnumber窗口宽度
heightnumber窗口高度
topboolean窗口是否置顶

before-help

点击顶部帮助按钮时触发,支持 preventDefault 阻止默认行为。

回调参数

参数名类型说明
eBeforeHelpEventCustomEvente.detail.message 为帮助链接 URL,e.detail.version 为版本号(可能为 null
urlstring | undefined帮助链接 URL(与 e.detail.message 一致场景下的便捷参数,可省略)

before-show

当窗口在保活模式下被激活(显示前)时触发。

说明:该事件无回调数据。

show

当窗口被显示时触发(如从隐藏恢复、或配置 show 变为 true)。

说明:该事件无回调数据。

hide

当窗口被隐藏时触发(如调用隐藏或配置 show 变为 false)。

说明:该事件无回调数据。

will-show

当窗口从隐藏变为显示前触发(宿主侧 cloudWindowMgr.show() 在将 config.show 置为 true 之前,会经同步事件通道派发该事件)。

回调参数

参数名类型说明
eEvent可在回调中调用 preventDefault() 阻止本次显示;若被阻止,窗口保持隐藏

message

当其他窗口通过 sendTo 或桌面通过 send 发送消息时触发。

回调参数

参数名类型说明
dataany消息体
fromstring发送方窗口标识或来源

wsData

通过桌面 WebSocket 下行触发的窗口内事件。

回调参数

参数名类型说明
dataobjectWebSocket 数据包

后端标准数据结构(示例)

json
{
  "app_id": "com.xxxx",
  "data": {
    "body": {},
    "event": "xxxx"
  },
  "role": "",
  "type": "app-event"
}

拖拽事件

拖拽事件基于 HTML5 Drag and Drop API,支持以下场景:

  • 从本地拖拽文件到窗口
  • 从窗口内拖拽元素到其他窗口
  • 从浏览器拖拽内容到窗口
  • 跨窗口拖拽数据

事件触发顺序

正常拖拽流程

dragEnter → dragOver(持续触发)→ drop/dragEnd → dragLeave

跨窗口拖拽

窗口 A: dragEnter → dragOver → dragLeave
窗口 B: dragEnter → dragOver → drop/dragEnd → dragLeave

dragEnter

当拖拽进入窗口时触发。

触发时机

  • 从外部拖拽文件/内容进入窗口区域
  • 从其他窗口拖拽进入当前窗口
  • 从当前窗口内的子元素拖拽到父元素

回调参数

参数名类型说明
dataDragData | any | undefined拖拽数据

数据来源

  1. 浏览器 DataTransfer 数据 — 无上述自定义数据时,返回标准 DragData 对象 2空拖拽 — 既没有自定义数据,dataTransfer.types 也为空时,返回 undefined

DragData 对象结构

ts
interface DragData {
  files?: File[]                 // 拖拽的文件列表(本地文件)
  items?: DataTransferItemList   // DataTransfer items(支持文件夹拖拽)
  types?: string[]               // 数据类型列表,如 ['Files', 'text/plain']
  effectAllowed?: string         // 允许的拖拽效果,如 'copy'、'move'
  dropEffect?: string            // 当前拖拽效果
  text?: string                  // 文本数据(如果有)
  [key: string]: any             // 其他自定义字段
}

说明

  • files:仅包含文件列表,不包含文件夹内的文件
  • items:提供更底层的 API,可通过 webkitGetAsEntry() 递归读取文件夹结构

示例

ts
cloudWindow.on('dragEnter', (data) => {
  if (!data) {
    console.log('空拖拽')
    return
  }

  // 情况1:自定义数据(任意结构)
  if (typeof data === 'object' && !data.types) {
    console.log('自定义数据:', data)
  }

  // 情况2:标准 DragData
  if (data.files) {
    console.log('拖入文件:', data.files)
  }
  if (data.text) {
    console.log('拖入文本:', data.text)
  }
})

dragOver

当拖拽在窗口上移动时触发(持续触发)。

回调参数

参数名类型说明
dataDragData | any | undefined拖拽数据,结构同 dragEnter

dragEnd

当拖拽在窗口上释放(drop)时触发。

回调参数

参数名类型说明
dataDragData | any | undefined拖拽数据,结构同 dragEnter

触发时机

  • 在窗口内释放拖拽(松开鼠标)
  • 在窗口的空白区域释放(未被子元素的 drop 事件拦截)

说明:如果子元素调用了 e.stopPropagation()dragEnd 不会触发;dragEnd 是冒泡阶段的兜底处理。

示例

ts
cloudWindow.on('dragEnd', (data) => {
  if (data?.files) {
    console.log('接收文件:', data.files)
  } else if (data) {
    console.log('接收自定义数据:', data)
  }
})

dragLeave

当拖拽离开窗口时触发。

说明:使用计数器机制,避免子元素边界误触发。该事件无回调数据。

拖拽使用场景

场景 1:跨窗口拖拽自定义数据

发送方:在 dragstart 中通过 dataTransfer(如 setData / effectAllowed)写入业务数据,或按你们工程对拖拽管线的封装处理。

ts
function startDrag(e: DragEvent) {
  if (!e.dataTransfer) return
  e.dataTransfer.setData('text/plain', JSON.stringify({ id: 123, name: 'Item from test2' }))
  e.dataTransfer.effectAllowed = 'copy'
}

接收方(若发送方写入的是 text/plain 中的 JSON,可从 data.text 解析):

ts
cloudWindow.on('dragEnd', (data) => {
  if (data?.text) {
    try {
      const payload = JSON.parse(data.text)
      console.log('接收到跨窗口数据:', payload)
    } catch {
      /* 非 JSON 时按纯文本处理 */
    }
  }
})

场景 2:自定义拖放区域

如果页面中有特定的拖放区域(如上传框),可以使用原生 HTML5 事件:

vue
<template>
  <div
    class="drop-zone"
    @dragenter="handleDragEnter"
    @dragleave="handleDragLeave"
    @dragover.prevent="handleDragOver"
    @drop.prevent.stop="handleDrop"
  >
    拖放文件到这里
  </div>
</template>

<script>
export default {
  methods: {
    handleDrop(e) {
      // 阻止事件冒泡,防止触发 cloudWindow 的 dragEnd
      e.stopPropagation()
      const files = e.dataTransfer.files
      console.log('Drop zone 接收文件:', files)
    }
  }
}
</script>

说明:自定义区域必须调用 e.preventDefault()e.stopPropagation()stopPropagation() 会阻止事件冒泡到 cloudWindowdragEnd

拖拽注意事项

拖拽数据可能是以下任意一种:

  • undefined — 空拖拽或无效拖拽
  • DragData 对象 — 标准浏览器拖拽数据
  • 任意自定义对象 — 内部拖拽管线提供的自定义载荷(若存在)

建议

ts
cloudWindow.on('dragEnd', (data) => {
  if (!data) {
    console.log('无效拖拽')
    return
  }

  if (data.files) {
    // 处理文件
  } else if (data.id) {
    // 处理自定义数据
  }
})

静态属性

cloudWindow.winId

当前窗口的唯一 ID(只读)。

类型string

方法

子窗口

createSubWin()

创建子窗口,参数定义同参见 窗口配置说明

仅当显式传入 belowGroup: null 时按非从属窗口处理(并可在此分支下继承图标);否则会将 belowGroupparent 设为当前窗口 winId,作为子窗口创建。

返回值Promise<string>,解析为子窗口的 options.name

窗口尺寸与位置

getSize()

获取当前窗口大小。

参数:无

返回值Promise<{ width: number; height: number }>

setSize()

设置当前窗口的宽高。如果窗口是最大化状态,将取消最大化。

参数

参数名类型必填说明
widthnumber窗口宽度
heightnumber窗口高度

返回值Promise<void>

getSizeInfo()

获取窗口的完整尺寸信息。

参数:无

返回值Promise<SizeInfo>

ts
interface SizeInfo {
  x: number        // 窗口 x 坐标
  y: number        // 窗口 y 坐标
  width: number    // 窗口宽度
  height: number   // 窗口高度
  maxHeight: number
  maxWidth: number
  minHeight: number
  minWidth: number
  radius: number   // 圆角大小
}

setMinSize()

设置当前窗口的最小宽高。

参数

参数名类型必填说明
widthnumber最小宽度
heightnumber最小高度

返回值Promise<void>

setMaximumSize()

设置窗口的最大尺寸。设置后,窗口最大化时会遵循此尺寸限制,而不是占满整个屏幕。

参数

参数名类型必填说明
widthnumber最大宽度,设置为 0 或负数表示无限制
heightnumber最大高度,设置为 0 或负数表示无限制

返回值Promise<void>

getPosition()

获取窗口位置。

参数:无

返回值Promise<{ x: number; y: number }>

setPosition()

设置窗口位置。

参数

参数名类型必填说明
xnumberx 坐标
ynumbery 坐标

返回值Promise<void>

center()

居中定位窗口。

参数:无

返回值Promise<void>

getRelativePos()

获取相对整个系统的坐标(基于传入的 pageX、pageY 转换)。

参数

参数名类型必填默认值说明
eventobject包含 pageXpageY 的事件对象
offset{ x: number; y: number }{ x: 0, y: 0 }偏移量
reservebooleanfalse反转模式

返回值Promise<{ pageX: number; pageY: number }>

窗口状态

maximize()

设置当前窗口为最大化。

参数:无

返回值Promise<void>

unmaximize()

取消当前窗口最大化。

参数:无

返回值Promise<void>

isMaximized()

查询当前窗口是否最大化。

参数:无

返回值Promise<boolean>

minimize()

最小化当前窗口。

参数:无

返回值Promise<void>

restore()

将窗口置于顶层并取消最小化与标题栏「还原」按钮触发的窗口内逻辑(在最大化/还原之间切换)不是同一套 API。

参数:无

返回值Promise<void>

isMinimized()

查询当前窗口是否最小化。

参数:无

返回值Promise<boolean>

show()

显示当前窗口(将窗口配置 show 置为 true)。窗口从隐藏变为显示时会触发 show 事件。

参数:无

返回值Promise<void>

hide()

隐藏当前窗口(将窗口配置 show 置为 false)。窗口从显示变为隐藏时会触发 hide 事件;窗口仍在内存中,可再次调用 show() 显示。

参数:无

返回值Promise<void>

窗口控制

close()

关闭当前窗口,会触发 before-close 事件(可阻止)和 close 事件。

参数:无

返回值void

loadUrl()

设置当前窗口的 URL。

参数

参数名类型必填说明
urlstring要加载的 URL

返回值Promise<void>

damaged()

标记窗口为已损坏,强制清除窗口缓存。

参数:无

返回值Promise<void>

说明

  • 设置 cacheTime0,设置 hideOnClosefalse
  • 适用于窗口内容出现异常需要重新加载时

示例

ts
// 当窗口出现严重错误时,标记为损坏
cloudWindow.damaged()
cloudWindow.close() // 关闭后会彻底销毁,不会缓存

setMovable()

设置窗口是否允许拖拽移动。

参数

参数名类型必填说明
stateboolean是否允许拖拽

返回值Promise<void>

setResizable()

设置当前窗口是否允许拖拽改变大小。

参数

参数名类型必填说明
resizableboolean是否允许调整大小

返回值Promise<void>

setMinimizable()

设置当前窗口是否允许最小化。

参数

参数名类型必填默认值说明
openboolean是否允许最小化
showIconbooleanfalse不允许最小化时是否仍显示最小化按钮图标

返回值Promise<void>

setMaximizable()

设置当前窗口是否允许最大化。

参数

参数名类型必填默认值说明
openboolean是否允许最大化
showIconbooleanfalse不允许最大化时是否仍显示最大化按钮图标

返回值Promise<void>

setClosable()

设置当前窗口是否允许关闭。

参数

参数名类型必填说明
closeableboolean是否允许关闭窗口

返回值Promise<void>

setAlwaysOnTop()

设置窗口是否置顶。

参数

参数名类型必填说明
valboolean是否置顶

返回值Promise<void>

isAlwaysOnTop()

查询窗口是否置顶。

参数:无

返回值Promise<boolean>

focus()

设置窗口聚焦。

参数:无

返回值Promise<void>

blur()

设置窗口失焦。

参数:无

返回值Promise<void>

isFocus()

查询窗口是否聚焦。

参数:无

返回值Promise<boolean>

窗口外观

getTitle()

获取当前窗口的标题。

参数:无

返回值Promise<string>

setTitle()

设置当前窗口的标题栏,会同步改变任务栏标题和窗口标题。桌面端无法调用。

参数

参数名类型必填说明
titlestring窗口标题

返回值Promise<void>

getIcon()

获取窗口的图标地址(即 create 时传入的参数)。

参数:无

返回值Promise<string | null>

setBackgroundColor()

设置窗口背景颜色。

参数

参数名类型必填说明
colorstring背景颜色,支持 CSS 颜色值,设置为 transparent 表示透明

返回值Promise<void>

setShadowColor()

设置窗口阴影。

参数

参数名类型必填说明
colorstring | boolean自定义阴影字符串;true 使用默认阴影;false 无阴影

返回值Promise<void>

setRadius()

设置窗口圆角大小。

参数

参数名类型必填说明
radiusnumber圆角大小(像素)

返回值Promise<void>

setStyle()

设置窗口元素的自定义样式。

参数

参数名类型必填说明
objRecord<string, string | number>样式对象,数值会自动添加 px 单位

返回值Promise<void>

说明:以下属性被禁止修改(保护窗口布局):

  • 布局相关:widthheightlefttopbottomrightpositionpaddingmargin
  • 层级相关:z-index
  • 窗口外观:backgroundbackground-imagebox-shadowborder-radiusdisplay

示例

ts
// 设置窗口边框
await cloudWindow.setStyle({
  border: '2px solid #409eff',
  borderStyle: 'dashed'
})

// 设置透明度和过渡效果
await cloudWindow.setStyle({
  opacity: 0.95,
  transition: 'all 0.3s ease'
})

registerHeader()

注册自定义窗口操作标题栏元素,可实现拖拽、双击缩放。调用后会强制设置 frame = false,取消注册也不会还原此状态。

参数

参数名类型必填默认值说明
handleHTMLElement | Element设置为窗口操作栏的元素
focusbooleanfalse强制设置(会取消之前设置的元素)

返回值Promise<Function | 0>,一般为卸载拖拽监听的清理函数;在部分场景下可能为 0(表示未注册新的本地拖拽逻辑,与旧版兼容)

setActionPosition()

自定义窗口操作按钮的位置,强制设置 frame = false

参数

参数名类型必填说明
ynumber操作按钮的 Y 轴位置
xnumber操作按钮的 X 轴位置,仅 Mac 下有效

返回值Promise<number>,成功时为 1

setActionVisible()

控制窗口顶部操作按钮的显示和隐藏。

参数

参数名类型必填说明
actionRangeArray<'mini' | 'close' | 'restore' | 'help'>需要操作的按钮类型列表
stateboolean显示状态,true 显示,false 隐藏

返回值Promise<void>

示例

ts
// 隐藏最小化和帮助按钮
await cloudWindow.setActionVisible(['mini', 'help'], false)

// 显示所有按钮
await cloudWindow.setActionVisible(['mini', 'close', 'restore', 'help'], true)

setHelpInfo()

更新顶部窗口帮助按钮配置,传入 undefined 为隐藏。

参数

参数名类型必填说明
infostring | undefined帮助信息或链接,undefined 表示隐藏帮助按钮

返回值Promise<void>

消息与事件通信

listenWindowData()

监听窗口的数据,包含 create 时从 data 参数传入的,以及 send 方法发送的。

参数

参数名类型必填说明
callback(message: any, from: string) => void回调函数,接收消息内容和消息来源

返回值Function,调用返回值可取消当前监听

send()

发送数据到顶层(桌面接收)。

参数

参数名类型必填默认值说明
dataany要发送的数据
eventstring''自定义事件名;不得与内置窗口事件名冲突

返回值Promise<void>

sendEvent()

发送事件到顶层(桌面接收)。

参数

参数名类型必填默认值说明
eventstring自定义事件名;不得与内置窗口事件名冲突
dataanyundefined事件数据

返回值Promise<void>

sendTo()

发送数据到指定窗口。对应窗口可使用 on('message', (data, from) => {}) 接收。

参数

参数名类型必填默认值说明
winIdstring目标窗口唯一标识
dataanyundefined要发送的数据
eventstring''自定义事件名;不得与内置窗口事件名冲突

返回值Promise<void>

sendEventTo()

发送事件到指定窗口。对应窗口可使用 on(event, (data) => {}) 接收。

参数

参数名类型必填说明
winIdstring目标窗口唯一标识
eventstring自定义事件名;不得与内置窗口事件名冲突
dataany事件数据

返回值Promise<void>

sendEventToGroup()

发送事件给一组窗口(创建时 config.group 相同的)。请合理使用,避免不必要的问题。

参数

参数名类型必填说明
groupstring | string[]窗口组名称或名称列表
eventstring自定义事件名;不得与内置窗口事件名冲突
dataany事件数据

返回值Promise<number>,实际派发到的窗口数量

sendEventToMyGroup()

发送事件给当前窗口所在的组(创建时 config.group 相同的)。

参数

参数名类型必填说明
eventstring自定义事件名;不得与内置窗口事件名冲突
dataany事件数据

返回值Promise<number>,同组内除自身外的窗口数量(即 sendEventTo 调用次数)

useCapacity()

调用桌面开放能力,参见 桌面开放能力调用说明

参数

参数名类型必填默认值说明
capNamestring应用能力名称,由被调用方决定
dataany应用能力调用参数,由被调用方决定
timeoutnumber0超时时间(ms),0 表示不超时

返回值Promise<any>,能力调用结果

窗口组

getGroup()

获取窗口所属的组。

参数:无

返回值Promise<string>,无群组时为空字符串 ''

getGroupList()

获取窗口所在组的所有窗口名称(不包含当前窗口)。

参数:无

返回值Promise<string[]>

getGroupPosition()

获取当前窗口在同 config.group 下的完整成员列表(含自身)中的索引;该列表与 getGroupList() 不同,后者会排除当前窗口。

参数:无

返回值Promise<number>,无群组或不在列表中为 -1

queryIsExist()

查询指定组中是否存在指定名称的窗口。

参数

参数名类型必填说明
groupstring窗口组名称
winNamestring窗口名称

返回值Promise<boolean>

示例

ts
const exists = await cloudWindow.queryIsExist('main-group', 'settings-window')

if (exists) {
  console.log('设置窗口已存在')
} else {
  ///
}