diff --git a/docs/mstsc-feasibility.md b/docs/mstsc-feasibility.md new file mode 100644 index 0000000..95ddc10 --- /dev/null +++ b/docs/mstsc-feasibility.md @@ -0,0 +1,73 @@ +# 研究:在 Avalonia.Controls.WebView 思路下内嵌 mstsc(Remote Desktop ActiveX)可行性 + +## 1. 项目现状调研(与本议题相关) + +基于当前代码,项目已经具备“平台适配器 + NativeControlHost + HWND 重父子关系”的通用能力,关键点如下: + +- 统一抽象层:`IWebViewAdapter` / `WebViewAdapter`(`src/Avalonia.Controls.WebView.Core/IWebViewAdapter.cs`、`WebViewAdapter.cs`) +- 宿主承载层:`NativeWebViewControlHost` 通过 `CreateNativeControlCore` 创建并承载原生句柄(`src/Avalonia.Controls.WebView/NativeWebViewControlHost.cs`) +- Windows 下已有两类实现: + - WebView1(WinRT/COM 互操作):`src/Avalonia.Controls.WebView.Core/Win/WebView1/*` + - WebView2(COM 互操作):`src/Avalonia.Controls.WebView.Core/Win/WebView2/*` +- 已有 `SetParent(HWND)`、尺寸同步、事件回调、资源释放等关键流程(如 `WebView1Adapter`、`WebView2BaseAdapter`) + +结论:项目在“无 WinForms,直接托管 Windows 原生/COM 控件”方面已有成熟基础,这和 mstsc 控件集成路径是同一技术方向。 + +## 2. mstsc 相关技术要点 + +mstsc 可编程能力主要来自 Remote Desktop ActiveX(`mstscax.dll`)及其 COM 接口族(如 `IMsRdpClient*`)。 + +典型特征: + +- 本质是 ActiveX/COM 控件,不是纯托管控件 +- 需要 STA 线程与消息循环 +- 需要原生窗口宿主(HWND)与 in-place 激活/尺寸/焦点管理 +- 事件通过 COM 事件机制回调(连接点模型) + +这意味着:若不依赖 WinForms `AxHost`,就需要自己做一层 ActiveX 宿主包装(或复用现有原生封装库)。 + +## 3. 可行性结论 + +**可行,但复杂度中到高,建议以 PoC 先行。** + +原因: + +1. 本项目已经验证了同类能力(COM + HWND + NativeControlHost) +2. mstsc 控件形态与 WebView1/2 不同,但“承载和生命周期管理”方法可复用 +3. 真正难点在 ActiveX 宿主细节、输入焦点、安全策略与兼容性,不在 Avalonia 侧 + +## 4. 关键实现点(建议) + +1. **新增独立适配器层(Windows only)** + 参考 `Win/WebView1`、`Win/WebView2` 结构,新增 `Win/Rdp` 目录,避免影响现有 WebView 逻辑。 + +2. **先做最小 PoC** + - 能创建控件并嵌入 `NativeControlHost` + - 能设置服务器地址并连接/断开 + - 能稳定响应 resize、focus、dispose + +3. **线程与生命周期** + - 所有 COM 创建/调用保持在 STA/UI 线程 + - 明确释放顺序(事件解绑 -> 断开连接 -> COM 释放) + - 处理异常断连与宿主销毁竞态 + +4. **输入和窗口行为** + - 焦点切换、快捷键、鼠标捕获、DPI/缩放 + - 多显示器和窗口重建(reparent)场景 + +5. **能力边界** + - 先聚焦“内嵌显示 + 基本连接” + - 高级能力(重定向、网关、高级认证策略)分阶段引入 + +## 5. 注意事项与风险 + +- **安全**:凭据处理、证书校验、剪贴板/磁盘重定向策略必须默认安全 +- **系统依赖**:功能随 Windows 版本和远程桌面组件能力差异而变化 +- **维护成本**:ActiveX/COM 宿主代码可维护性与测试成本明显高于 WebView2 +- **测试要求**:需要真实 Windows 环境联调(CI 很难完整覆盖) + +## 6. 建议的落地策略 + +1. 先提交 PoC 分支验证“可嵌入 + 可连接 + 可释放” +2. PoC 通过后再抽象公共接口,并补齐错误处理与安全默认项 +3. 最终再评估是否对外公开 API,避免过早承诺全部 mstsc 高级特性