Skip to content

组件运行、多显示器与窗口 ​

会话与资源 ​

持久提醒由宿主运行期轮询,隐藏或页面重载保留,正常退出开始后不再领取或投递,未来有效项重启恢复;不依赖网页定时器或系统后台任务。

纯展示模板星河微光使用 inputMode=none,宿主拒绝该模式的 setInputRegions;作者停止绘制不改变宿主隐藏继续运行语义,可信编辑仍可恢复。

正常退出应用提供共同期限的保存机会,再关闭运行时并排空后台工作;当前仅覆盖正常退出,不包括停用/更新。处理器、最大实例数、截止及原子提交边界统一见实例存档。退出等待不在 UI 同步阻塞,也不授予作者否决权。

可信文件选择由运行时发起、管理 UI 收集选择,Services 在外部 IO 队列打开和登记有界资源。包内资产同样在外部 IO 队列打开,由服务确定激活版本的根目录,与用户导入共享有界资源登记。网页只接收随机资源 ID 与文件名/长度,不能提供本机路径。选择器跟随请求取消和文档失效关闭;范围读取使用明确 offset,不在丢失响应后偷偷前移游标。期限、配额及方法以宿主协议为唯一权威定义。

生命周期的产品语义以本文为准;身份与持久化见 架构(宿主文档:../architecture.md)。

文件选择的模态循环由组件原生窗口消息调度,在 WebView2 事件返回后运行,不嵌入 WebMessageReceived 或占据 DispatcherQueue 回调。UI 定时器检查取消、期限和服务投递代次。系统 Close 返回后若窗口仍可见,仅通过当前 IFileDialog 的 IOleWindow 获取 HWND,并核实本进程与管理窗口所有权后请求正常关闭;不枚举或操作其他应用窗口。资源访问除原文档存活检查,还匹配运行时可信传入的实例/会话标识,候选与旧网页同时存在也不能互读或关闭句柄。

虚拟文件拖出的OLE模态循环同样通过独立原生窗口消息启动,避开DispatcherQueue回调;等待任务在关闭或故障时释放,实际启动前仍检查文档、服务投递及原生鼠标状态。IDataObject另外支持Shell辅助对象写回的注册HGLOBAL格式,最多16种、合计64 KiB,复制后按COM所有权约定释放;这些数据不能覆盖封存的描述符、内容或COPY偏好。导出保存沿用同一原生消息调度与单份模态选择保护,先封存已写满的资源,再展示系统保存选择器。Services 在有界外部 IO 队列将资源复制到可信所选目录的暂存文件,最后提交;网页不能给出目标路径,不能在选择期间继续修改封存内容。具体预算、提交点及取消语义以宿主协议为准。

HTTP open/read/close 使用同一有界外部 IO 队列和 Services 所有的流登记,独立于文件额度。原生平台只依赖窄的有效性/秘密解析回调,不包含服务模型;每次读取及最终响应票据覆盖原秘密绑定代次。取消仅标记失效,在途同步 WinHTTP 调用返回后才关闭句柄。后台周期统一回收导入、导出和 HTTP 传输资源,UI 不执行 CloseHandle/WinHttpCloseHandle 或等待网络。

状态与操作 ​

自主移动无需用户授权开关;已启用且可见的实例可调用受约束的 window.moveTo,Services 保留实例、版本、可见性与投递代次检查。运行时最多保存一个待应用位置,每16ms合并;隐藏、编辑、全局暂停、锁屏或系统挂起停止接受并清除待移动,不恢复旧请求。临时位置不写布局,编辑和重载恢复已保存锚点。

用户控制两个独立值:enabled(启用意图)与 visible(可见性偏好)。首次启用默认 visible=true,默认层级和大小来自 manifest;后续停用不重置这些偏好。

enabled显示器visible实际行为
false任意任意没有运行 WebView,无组件后台工作,保留配置
true已连接true运行且显示
true已连接false继续运行,窗口隐藏
true已断开任意销毁运行资源,保留启用意图、可见性和位置

加载中、故障、下载中、等待显示器等是诊断或交付状态,不额外增加用户“运行状态开关”。停用按钮必须立即阻止新调用并取消在途可取消工作,之后释放资源;不能只是 Hide 窗口。

隐藏不会主动调用 WebView 挂起、停止网络、禁用宿主计时或取消组件工作。浏览器自身后台调度可能降低频率,作者不能假定隐藏时仍保持精确帧率。显示恢复不重新创建实例、不丢失其内存状态;断屏与停用会重新创建运行环境,需用持久存储恢复。

包内资源加载使用独立的 2 线程队列,每安装最多同时执行 1 项,执行与等待合计全局最多 256 项、每安装最多 64 项;按安装轮转调度。单 WebView 最多持有 64 个未完成资源请求,超出额度返回 HTTP 503 并完成 deferral,不无限排队。导航、关闭或故障使等待中的旧资源工作失效。资源字节在后台读取,WebView COM 对象和 deferral 仍只在 UI 线程操作;慢外部 I/O 和开发扫描不占用此队列。宿主请求额度见宿主接口。

实例 KV 使用独立的 2 线程有界队列,每安装最多执行 1 项,执行与等待合计全局最多 64 项、每安装最多 16 项,按安装轮转;不占用元数据、外部 IO 或包资源队列。等待计入请求原有期限,容量不足返回 QUOTA_EXCEEDED。安装级存储锁串行化 KV 与卸载清理,不能阻塞 UI 的已发布快照读取。管理计时器在 busy 判断之前执行目录快照回收,规则见宿主接口。

配置默认独立于其他显示器。UI 提供“在此显示器启用”。实例唯一性在领域服务和持久化校验中保证,不能只禁用按钮。窗口拖动不能悄悄生成另一屏实例。

全局暂停 ​

可信设置页与托盘提供“暂停全部 / 恢复全部”。Services 唯一持有本宿主会话的临时暂停策略,默认关闭,重启不保留,不进入布局、配置、授权或存档。暂停覆盖全部显示器,包括原本隐藏的实例;不改变 enabled、visible、位置、层级或编辑模式偏好。实际组件窗口、透明输入表面和编辑遮罩暂时隐藏并结束交互,恢复按最新显隐偏好显示且不抢焦点。管理界面和托盘继续可用。

运行时先将 WebView2 controller 的 IsVisible 设为 false,再调用 ICoreWebView2_3::TrySuspend;异步成功仅记录内部挂起状态,不展示成功计数或状态摘要;调用失败、浏览器拒绝或超时显示异常,不能把隐藏等同于暂停成功。每个视图最多一份在途挂起,不无限重试;恢复调用 Resume,包括快速恢复后迟到的挂起回调,原本隐藏的视图也显式恢复。恢复失败保留隐藏并提示重新暂停/恢复或重载。暂停期间新启用、重载及断屏回接的视图保持隐藏,加载完成后尝试挂起;导航会自动恢复,因此每个新文档重新尝试。正常退出在共同保存期限内先恢复各视图,再按原有 lifecycle.closing 流程保存。

这是 WebView2 的尽力挂起:脚本计时器与动画可暂停,正在执行的脚本不被强制中断,音频或其他浏览器条件可能阻止挂起。不承诺断网、暂停宿主后台 IO/持久提醒或停止全部进程。官方 API 约束见ICoreWebView2_3。

窗口外观与编辑 ​

圆角不透明实例及透明实例共用WebView2 composition controller与Windows.UI.Composition;圆角使用CompositionVisualSurface捕获的WebView画面与Direct2D抗锯齿浮点圆角透明度蒙版,视觉HWND不设置GDI窗口区域并整体穿透,独立无绘制输入HWND接收同一轮廓内的有效区域;两者属于同一实例,不产生第二份身份、权限、存储或事务。合成器由管理窗口拥有并按UI线程共享,按需创建;正常退出先释放所有实例视觉树,再异步排空自建Windows.System队列,消息循环结束前完成,不关闭借用的队列。分离表面避免裁剪装饰内容,穿透依赖原生layered规则,不能仅靠背景alpha或HTTRANSPARENT宣称成功。输入表面跨父窗口切换前取消捕获并重建,避免复用已呈现的无重定向HWND产生不透明遮挡;保留同一WebView页面。视觉表面与输入表面共享显示、挂载和稳定层级,显示/恢复不抢焦点;只在真实交互时给该 WebView 键盘焦点。完整编辑遮罩覆盖作者交互区及空集合,网页不能通过变更区域绕过可信编辑。离开交互区后仍保留已建立的鼠标捕获,松开、失焦/取消、隐藏或退出时解除;故障释放输入表面。临时拖动位置不回写配置、布局或存档,进入可信编辑时恢复持久位置。触摸/笔与真实IME验证限制须明确记录,不能将鼠标通过推定为所有设备通过。

自主移动的原生生命周期保护分别记录锁屏与电源挂起原因:解锁只解除锁屏,自动恢复只解除挂起,两者都解除才允许后续请求及待应用位置。任一停止通知清除待移动并结束交互,重复通知幂等;不因系统上下文后台采样或另一类恢复而清除尚存原因。该保护不更改活动暂停、可见/启用意图、作者事件格式或 Services 所有权,也不自动重放已取消的位置。

透明触摸/笔由同一辅助表面处理,最多八个本窗口指针;稳定转换、主输入拖动及取消边界统一见宿主输入协议。不创建每触点原生窗口,不使用全局指针路由或钩子;实际系统合成输入与物理设备检查须分开记录。

取消使用宿主输入协议规定的文档级规范化适配器:真实输入转发和宿主生成的非可信取消明确区分。原生账本先移出,适配器完成后再结束浏览器内部接触,不跨 COM 调用保留 Surface 或 vector 迭代器。独立模块只持有本 WebView、共享失效状态和最多八帧;导航/关闭使旧回调失效,定期运行检查发现失败或两秒截止后进入已有可重载故障。脚本注册完成后才能配置并导航,关闭移除注册。

指针捕获变化只按消息携带的 ID 核对仍活动的账本项;正常抬起后的捕获释放和未知旧 ID 不得取消其他接触。鼠标捕获变化只在本表面确有鼠标捕获时触发取消,WM_CANCELMODE 仍终止整个窗口交互。

组件窗口默认不透明并采用8 DIP圆角,画面由合成clip抗锯齿裁剪;输入区域与画面共用物理像素宽高、浮点半径和短边约束,按像素中心位于圆角轮廓内生成原生命中区域,半透明边缘不扩大命中。0为直角,透明实例保持作者轮廓。圆角在尺寸、缩放及层级改变后同步,不开放网页修改其他窗口。作者停靠机制已移除,位置由用户编辑或现有拖动、自主移动接口控制。内容区承载网页;可按清单启用透明和明确输入区域。置顶使用顶层窗口,置底使用桌面宿主的子窗口,挂载不可用时回退普通置底窗口。不显示独立任务栏按钮、不把每个组件或输入辅助表面加入 Alt+Tab,仍允许在置底/置顶规则下接收输入。WinUI 管理窗口承担常规任务切换入口;修改窗口样式时实际确认任务切换与输入行为。

组件主视图和附属视图使用 WebView2 的 Fluent 覆盖式滚动条。内容溢出时仍可滚动,滚动条覆盖在内容上而不缩小页面布局宽高,明暗样式由网页 color-scheme 决定;作者自行实现的滚动控件仍由作者负责。

窗口尺寸由作者通过包默认值与 window.setSize 决定,用户通过编辑模式调整位置。

边缘花园的布局选择一次只提交一个 config.set,握手前禁用按钮,提交中重复点击不排队;外部配置变化仍合并为最新尺寸。页面离开取消当前配置、尺寸和交互区请求,解除监听,迟到响应不再触发后续调用。取消不能撤回已成功提交的配置,存档仍独立于布局。

边缘花园在某次window.setSize失败后,仍处理该请求等待期间已合并的最新配置;只保留一个最新目标,不回放中间尺寸,不自动重试失败目标。无新目标时保留上一成功模式/尺寸并提示重试,下一次配置选择可恢复;最新目标成功后清除旧错误。离开时清除目标,迟到拒绝不再改界面或发请求。只改变模板恢复调度,不扩大宿主尺寸权限,不回滚已提交配置,也不改动游戏存档。

布局配置提交若在等待响应期间已收到新的config.changed,则不再用旧响应重新设置尺寸;宿主配置事件已经进入相同的最新目标槽。无更新事件时仍使用成功响应,避免等待事件才能应用。此本地观察代次不代替Services的配置事务或宿主桥接序号,迟到响应不产生额外配置写入。

尺寸调整在途,或environment.bounds尚未匹配最后成功模式的宽高时,交互区只保留脏标记,不按旧上下文提交;调整结束且环境匹配后,再发送唯一最新区域。环境先于尺寸响应到达时也等请求收尾,编辑状态仍延后;离开后不续发。该模板次序用于避免改尺寸期间旧区域越界,不放宽宿主对交互区的范围校验,也不清空上一次有效区域。

显示页提供所选显示器的“编辑位置 / 完成编辑”入口,默认关闭,不持久保存。开启后该显示器所有可见且启用的组件上方出现宿主遮罩,阻止网页接收鼠标输入,按住遮罩即可拖动位置,尺寸不变。按下遮罩时立即将当前组件移到所属层最前,即使随后只松开鼠标、没有移动也生效;方向键移动同样将当前组件移到所属层最前。隐藏和停用组件保持原状态。模式关闭后自动移除全部遮罩,网页恢复输入;新启用、重载、授权变化而重建的组件继承该显示器当前模式。断屏自动关闭该屏编辑模式,回接不自动恢复;退出自动清理遮罩。遮罩不授予系统能力,不改变 top/bottom 模式和启用意图。

编辑模式使用宿主选中框、组件名称和位置反馈,覆盖作者交互区及纯展示组件。默认不夺取焦点,点击组件编辑遮罩取得选择和键盘焦点;Tab/Shift+Tab依次选择同屏可见组件。选中框及文字跟随宿主语言,按窗口DPI绘制,采用系统颜色并提供独立焦点框;小组件优先保留边框,文字按可用区域省略。

拖动以开始位置和屏幕鼠标位移计算DIP坐标,吸附到所属显示器工作区的同侧边缘/中心,或同屏其他可见启用组件的边缘/中心;边缘可贴齐,中心只对中心。不包含隐藏、停用或其他屏幕实例。8 DIP内吸附,已吸附匹配在14 DIP内保留,目标消失或变化重新计算。辅助线只在实际吸附时出现,覆盖当前工作区且不接收输入,不写入布局;Alt按住时临时取消吸附和辅助线,松开重新计算。没有永久停靠或组件关系,不影响作者自主移动。

方向键每次移动1 DIP,Shift+方向键移动10 DIP,键盘微调不强制吸附。拖动或微调只改变位置,不改变作者尺寸。鼠标松开提交位置;Esc在拖动中撤销本次拖动并恢复开始位置,空闲时退出该显示器编辑模式。失活或捕获取消结束交互、清除辅助线并保存已到达的位置;断屏、工作区/DPI或组件尺寸变化终止旧坐标拖动,不把旧屏坐标写入新工作区。退出编辑、隐藏、停用、全局暂停和关闭均释放自有捕获及辅助线,不重新获取捕获、不激活其他窗口。

应用失去激活时结束当前输入和编辑拖动,保留编辑开关;编辑位置只异步保存已经到达的位置,恢复激活不重新捕获。顶层管理窗口将失活通知转给活动及候选运行时,覆盖置底子窗口不能依赖自身顶层通知的路径;组件自身收到相同通知时幂等处理。先清除拖动账本并释放捕获,再排队保存,保存异常不能留下捕获。该路由不产生新的作者事件、权限或布局恢复行为。

可信编辑的正常抬起、取消及移除遮罩复用同一收尾边界:先清除拖动账本,按需释放本遮罩捕获,最后排队保存;排队失败清除待保存标记并提示可重试,不阻止释放或销毁遮罩。捕获已经转移时只结束旧账本,不释放其他窗口捕获,也不在 WM_CAPTURECHANGED 内重新获取或释放捕获。运行时已关闭时不再提交位置。此规则不改变 Services 的位置事务或作者输入协议。

关闭管理窗口收起托盘前结束所有显示器的编辑模式,防止留下拦截输入的遮罩;切换显示器不自动关闭别屏模式,显示页保留正在编辑的屏幕摘要。遮罩可通过键盘聚焦,方向键每次移动 1 DIP,Shift 加方向键每次移动 10 DIP,沿用拖动的位置约束和持久化规则;Esc 结束当前遮罩所属显示器的模式。位置即时保存,“完成编辑”不回滚位置。界面呈现见 管理界面(宿主文档:ui.md)。

开发组件作者开启设置中的开发者模式后,可从开发页抽屉选择已启用实例所属的显示器,显式打开其 WebView2 调试工具,查看控制台和页面;入口与不可用状态见开发组件。常规快捷键及浏览器右键菜单调试入口保持关闭,网页没有打开调试工具的宿主接口。调试不授予能力、不改变 CSP 或实例归属,宿主不保存控制台及网络正文日志。关闭开发者模式隐藏开发页并拒绝新调试操作;已打开的原生调试窗口可手动关闭,停用实例也会关闭其调试窗口。

拖动限于所属显示器工作区,跨屏调整通过在目标屏启用相同组件并配置实现,不隐式搬移或覆盖已存在实例。编辑模式不能改变“每屏唯一”的规则。尺寸超过工作区时保持作者尺寸,将位置约束至该屏工作区左上边界,不自动缩放;布局适配见 布局协议。

层级 ​

  • top:使用持续置顶语义;多个置顶组件彼此按下述编辑操作调整先后,不覆盖系统安全桌面等受系统控制表面。
  • 同层组件重叠时保持稳定的相对顺序;周期同步、移动和改尺寸不能轮流将各组件提到最前或压到最后。仅在置顶标志丢失、挂载组件落到图标视图下方、回退组件越过普通窗口或同层顺序偏离保存值时修复层级,回退检查将同类置底组件视为一组。
  • 新启用的组件默认进入所属层最前;编辑模式的单击、开始拖动或方向键移动也提升至所属层最前,后续拖动和周期同步保持该顺序。这里的“最前”只调整同层组件顺序,置底组件仍在普通应用之后。隐藏和再次显示保留该组件在同层中的位置,不能因显示而提升;隐藏期间其他组件的显式提升仍正常生效。同屏同层前后顺序由服务持久化为 zOrder(越大越靠前),随应用重启、窗口重建和断屏恢复;布局保存、导出、应用及应用前恢复快照也保留顺序。隐藏不改变 zOrder;从停用变为启用、切换到另一层时进入该层最前,重复启用不改变顺序。旧状态无顺序时按实例 ID 升序从后到前初始化,不能恢复旧版本未记录的历史遮挡关系。
  • bottom:组件挂载到 Explorer 承载桌面图标视图的 Progman/WorkerW 宿主中,位于桌面图标上方、普通应用窗口后方,遮住的图标区域由组件接收输入。正常挂载时 Win+D 和任务栏“显示桌面”后仍显示,网页继续运行;用户点击交互不改变置底关系。
  • 显示、恢复、改尺寸不主动抢前台。用户真实点击输入允许激活必要输入焦点,但不得把其他普通应用压到组件后面。
  • 挂载不修改 Explorer 的窗口样式、不隐藏图标、不接管系统快捷键。无法识别宿主、DPI 上下文不兼容或挂载失败时,回退普通持续置底并定期重试;回退期间不保证 Win+D 可见。只处理用户已启用且应显示的实例,不反向更改 visible。
  • Explorer 重启或桌面宿主重建后自动重新绑定。原组件窗口尚存时保留网页;如果系统已销毁组件窗口,则重建该实例的运行资源,从已保存数据恢复,网页内存状态可能丢失。恢复不抢焦点,不自动恢复拖动捕获。
  • 置顶窗口和虚拟桌面行为仍由 Windows 管理;桌面挂载不提供按虚拟桌面隔离或固定到所有虚拟桌面的配置。

桌面宿主层级属于未公开保证的 Shell 结构,Windows 更新可能导致回退。所有组件位置仍以所属显示器工作区 DIP 保存,挂载、拖动、作者改尺寸时统一转换到桌面宿主客户区坐标;不能把父窗口坐标写回持久化。

修改 bottom 策略时,实际操作受影响的输入、菜单或编辑行为。发现问题先修复;若确实需要改变持续置底或输入行为,再讨论产品取舍,不设独立 G1 准入流程。

显示器与恢复 ​

UI 选择器优先显示用户别名,未命名时显示系统友好名,并保留连接状态圆点。显示页可重命名当前已连接或仍有可管理内容的断开显示器,也可恢复系统名称;名称去除首尾空白后为1–80个UTF-16单元,拒绝控制字符,允许重名。别名按稳定设备身份保存在全局设置displayAliases,与系统名称displayNames分开;系统枚举不覆盖别名,重启/回接保留,显示、布局和开发选择器共同使用。别名不改变显示器或实例身份,不进入布局分享,不以名称推断设备关联。启动恢复不将断开显示器实例迁移到主屏。回接识别为同一显示器后按保存状态恢复,按当前 DPI 与工作区约束位置。

分辨率、缩放、主屏、任务栏位置变化更新目标屏的 DIP 换算;负坐标显示器和竖屏必须支持。无法可靠匹配设备时保留旧屏为断开并创建新屏记录,用户可在管理页识别,不猜测覆写数据。

Windows 虚拟桌面不作为 instance key。置顶窗口遵循 OS 窗口行为,挂载的置底组件遵循桌面宿主行为;不调用非公开 COM 接口枚举或强行固定所有窗口。

故障与退出 ​

页面错误不应终止宿主。原生消息处理必须捕获错误并返回协议错误,WebView 进程失败则关闭受影响会话、释放资源、标记诊断并提供“重载”。WebView 共享进程可能影响多个实例,要枚举实际受影响对象并逐项报告。

首版不无限自动重启出错组件:当前会话启动失败后保留 enabled=true 与故障诊断,等待手动重载;应用重启可以尝试一次恢复,持续失败仍停在诊断状态。所有权限拒绝是业务错误,不是组件启动失败。

WebView2 的 GPU、utility 子进程退出由运行时自动恢复,宿主不得因此关闭组件 Controller、清空会话或改成组件故障;主浏览器、主渲染器等不可自动恢复的失败仍保留上述手动重载语义。显示器调整可能伴随图形进程变化,应区分显示拓扑恢复与网页致命失败。

退出宿主时先禁止新操作,取消请求、解除事件、关闭所有 WebView/controller 和窗口,完成已提交状态落盘后退出。不强杀其他应用或用户启动的程序。管理窗口关闭与托盘退出的区别见 管理界面(宿主文档:ui.md)。

显示拓扑通过 QueryDisplayConfig 活动路径的 source GDI 名关联 HMONITOR,使用对应 target 设备路径生成稳定身份;不选择 EnumDisplayDevices 的固定第零项。路径统一大小写,旧路径摘要只在精确设备匹配且不冲突时迁移,实例 ID、配置、启用意图和恢复快照保留。拓扑查询失败不当作全部拔除,也不回退到主屏;等待下一次完整快照。系统调整显示位置或缩放不反向保存为用户拖动。

网页计算生命周期 ​

多边形交互区的纯几何校验归 services/geometry,运行时仅把已校验的 DIP 形状转换为整数像素。辅助输入表面用 GDI WINDING 多边形与矩形做并集,再与当前窗口范围求交;全部临时 HRGN 用 RAII 管理,仅 SetWindowRgn 成功后交给系统。Services 的事务、布局、存档与权限不参与高频区域更新。

有限系统上下文与生命周期事件见宿主协议。系统偏好与电源读取在有界后台队列完成,UI 只接收有效代次的结果;每实例最多一个采样任务,复用两秒系统快照,不把队列拥堵变成无限积压。当前会话通知由管理窗口注册,退出时解除;转发到现有及暂存实例不授予任何新操作。没有 OS 通知时不伪造休眠事件,不将采样间隔当作可信离线收益时间。

创建环境时使用 --disable-blink-features=SharedWorker;该 Chromium 开关不视为跨版本保证,必须在作者页面加载前以原始空白文档的只读探测验证生效。探测为 false、null 或执行失败时关闭实例 Controller,保留启用意图并显示运行环境不支持;不得进入作者页面或用 JS 覆盖 SharedWorker。Service Worker 继续由原生请求来源拦截。Dedicated Worker 的脚本 CSP 按 JavaScript MIME 注入,不能只依赖 ResourceContext 为 SCRIPT。当前运行时验证范围见实现说明。

Dedicated Worker 隶属当前主文档;隐藏不终止,导航/重载/停用后不允许向新会话投递旧任务。包内脚本请求沿用独立有界资源队列与文档代次,Worker 响应执行独立 CSP。Shared/Service Worker 不属于支持契约。透明、穿透与输入作为同一实例联合实现,实际路径与设备限制见实现说明。

后台资源收尾 ​

正常退出在 UI 消息循环仍可处理 COM 回调时,先在后台排空 IO、资源、存储和外部工作队列,再取消并回收目录监听及失效传输资源;不把队列 join 移到 UI。可信存档管理的待处理操作随退出取消,目录异步缓冲在确认原生完成后才释放。

目录自动刷新使用有界目录订阅,生命周期与后台退出收尾遵循该协议,不把通知当作完整文件事务。

可信停用全部 ​

设置和托盘提供“停用全部”。Services 将所有已存在实例(包括隐藏及断屏保留意图)的 enabled 在一次元数据事务中设为 false;提交成功后管理器关闭本安装的全部运行时,组件不自动恢复。没有启用项时幂等返回。失败保留原状态和运行资源,不能逐个提交而留下部分停用结果;后续用户可从显示页逐个重新启用。

该动作沿用停用语义,保留 visible、配置、权限、绑定、静音和安装共享存档;取消待投递提醒及使在途能力票据失效,重新启用不恢复旧票据。布局仍可由用户显式应用启用意图。缓存在其既定到期/配额策略内保留。它不是静音、隐藏或游戏内暂停,也不在停用时承诺正常退出的额外保存机会;只保留最近成功检查点,已进入原子发布的写入不能撤回,慢 IO 按原有取消/期限收尾。

入口属于可信 UI。托盘调用前在有草稿时显示管理窗口,沿用未保存配置的保存/放弃/继续编辑流程;忙碌、退出或没有启用项时禁用。操作不退出工坊、不影响其他数据根的安装或其他应用。管理运行时释放与后台请求失效须通过独立数据验证,不能把元数据全 false 视为资源已释放。

透明置底自有窗口兼容 ​

仅在透明置底表面生效,不向网页增加方法或权限。浏览器 PID 必须来自当前 WebView 的 BrowserProcessId;原生模块核对其父进程为当前宿主、创建时间不早于宿主、映像文件名为 msedgewebview2.exe,持有查询/同步句柄并在执行前核对创建时间和存活。不能仅凭进程名、窗口类名或裸 PID 修改窗口,也不读取命令行、其他应用标题或正文。

每个已核实浏览器共享一份 RAII 兼容对象,只处理无父/所有者的 Chrome_WidgetWin_1 顶层辅助窗口,要求 layered/toolwindow/noactivate、没有 WS_CHILD,且 GetLayeredWindowAttributes 成功报告 LWA_ALPHA 与 alpha=0。只添加 WS_EX_TRANSPARENT,不改颜色、alpha、其他样式、位置、焦点或层级。已有穿透位不记作本产品修改。每次写前重新核对进程、窗口线程、类、样式、alpha 和自有标记;记录使用窗口属性令牌防止 HWND 销毁复用后的错误恢复。

每浏览器至多每秒枚举一次,最多访问 2048 个顶层窗口、保存 32 条修改记录,最多 128 份活动浏览器兼容对象;首次身份快照最多检查 16384 个进程;身份、枚举额度或写入失败将共享兼容对象标为故障,后续刷新立即失败,各使用者关闭本实例呈现并保留故障恢复入口,不放宽筛选。跟踪窗口不再满足零透明度条件时撤回本产品添加的位;最后一个透明置底使用者释放时也撤回,保留其他样式。仅在仍匹配进程身份、窗口线程/类和自有令牌时恢复;窗口销毁或身份不符时不再写入。其他透明置底视图仍在使用时不提前恢复。正常退出、故障、改为置顶和重载释放引用;最近成功存档不随窗口恢复回退,未提交内存不承诺保存。

该路径依赖 Chromium 内部窗口结构,轮询不保证新建辅助窗口的零时延处理,也不保证 Evergreen 升级兼容。不能以命中检查代替真实穿透、网页输入和可信编辑恢复;失配按真实故障记录。Services 仍唯一持有事务及授权,其他应用和安装的数据不被修改。

透明桌宠 ​

examples/transparent-pet使用同一透明输入表面和多边形角色区,面板82DIP高。配置palette为mint/peach/sky,未知值回落mint;强制色使用系统轮廓,颜色不作为唯一状态。离开后的旧配置/输入回调不能改写DOM。

散步由组件自己的 wander 配置控制,默认关闭;宿主不提供额外自主移动授权开关。每秒最多一项移动;隐藏、暂停、锁定/挂起、编辑、节能、减少动画、拖动等待及面板控件持有焦点时跳过,不补排队。正常恢复后下一节拍重新判断,不主动切换焦点;临时位置不写布局或存档。

window.beginDrag单槽,重复真实按下不排队,结束/拒绝后释放,离开取消并移除监听。名字和投喂使用pet槽及成功修订CAS,空档可创建默认团团;同安装的所有实例均可写,冲突保留成功快照并要求显式重读。无效found=true值不当作空档,失败保留最后成功快照,合法重读恢复。

名字最多40单元,组词期间只显示草稿,不因change或投喂提交;结束后若已有change意图合并一次保存,否则等后续change或正常关闭。退出开始时仍组词则报告未完成,禁用输入引发的迟到结束不能改变决定。组合事件只用于编辑状态,不作为授权或可信输入证明。

状态区最多两行且可聚焦滚动,保留完整名字/计数和焦点提示。pagehide取消调用、停止移动、解除组合/输入/宿主订阅,迟到回复不得改旧页面。真实输入和设备覆盖见实现说明(宿主文档:../implementation.md)。

组件原生菜单 ​

所有组件视图移除WebView2的浏览器默认右键菜单,只展示作者通过SDK注册的有界业务动作;未注册、失效或创建失败时不展示菜单。主视图和附属视图使用相同规则,透传及编辑遮罩的输入边界保持不变;数据结构、选择投递与文档失效以组件右键菜单为准。

附属视图 ​

主实例可创建包内页面的临时附属窗口,共享实例身份并拥有独立Controller、文档会话和临时资源;不进入布局,不增加同屏组件份数,不允许递归开窗。窗口接口、通信、配额和生命周期以桌面扩展为准。

当前宿主协议 · SDK 0.1.1 · MIT