Skip to content

格子右键全链对齐原生:新建子菜单动态同源+列表命中区+双键圈选 - #563

Closed
Tianyu199509 wants to merge 1 commit into
release/1.5.9from
feat/native-menu-parity
Closed

Tianyu199509 wants to merge 1 commit into
release/1.5.9from
feat/native-menu-parity

Conversation

@Tianyu199509

Copy link
Copy Markdown
Owner

内容

格子右键交互全链对齐 Windows 原生(列表模式为主战场),三个子项:

1. 新建子菜单与资源管理器完全同源

  • 三注册布局枚举:直挂 HKCR\.ext\ShellNew、.ext\ProgId\ShellNew(Office 家族所在)、ProgId\ShellNew(Win10 文本文档所在);每扩展名取首个可用形状,VMware 式空值键与 Command-only(联系人)正确跳过且不遮蔽后来者。
  • 命名链:MenuText(@dll,-id 间接串解析+剥 (&S))→ ProgID FriendlyTypeName → ProgID 默认值。刻意不用 SHGetFileInfo 类型名——它跟 UserChoice 走(.md 实证:原生"WorkBuddy Document" vs SHGFI"MD 文件")。
  • 排序按扩展名而非显示名,与原生逐项吻合(docx<md<nbmx<…<zip);ItemName 即新建文件现成基名("新建压缩(zipped)文件夹"),新建 ZIP 带 Data 空档头合法可开。
  • 每行类型图标:SHGFI_ICON|USEFILEATTRIBUTES→HICON→IconHelper 现成 PNG 管线,右键时后台预取(ICONLOCATION 路线主流机器大面积空定位,证伪弃用)。
  • 快捷方式行:rundll32 appwiz 向导在 26xxx 已死(实测),改 AOT 安全 vtable 建无目标占位 lnk(IPersistFile::Save 槽 6)+ SHObjectProperties 属性表补目标(隔离契约判定:lnkfile 属性页=shell32 内建,三方全在 ContextMenuHandlers,见 Win32Helper 注释)。
  • 近版 Windows 无 .txt ShellNew 注册,SHGFI TypeName 兜底播种;顺带修 Win10 txtfile\ShellNew ProgID 布局盲区。

2. 列表模式右键命中区

仅「图标+名称」块(4px 外扩)弹文件菜单;行内其余右键=空白菜单+清选择(与真空白完全同一路径),「查看→图标」从行内随时可达。图标模式零影响。

3. 双键跑马圈选

左右键均可从行内空白起手(DragStarting 待定取消防文件拖拽抢手势,过阈值后指针捕获自防;行内空白左键单击仍由视图内建点击选择回选该行)。右键圈选松开就地弹作用于圈选结果的菜单(圈空弹空白菜单),一次性 suppress 防双弹。

根因修复(现场事故沉淀)

初版三路径全部死代码:FindItemElement(DataContext 走查)返回最内层命中元素,is FileItemSurface 恒假。新增 FindItemSurface 类型祖先链,契约钉 DoesNotContain 永禁 DC 走查结果做类型判定。

验证

  • 全量 x64:5701/5701 绿(HEAD 5692 + 净新增 9 测试;隔离工作树=本 PR 精确内容验证)
  • Simon 真机验收通过:行内空白右键空白菜单✓ / 图标+名称右键文件菜单✓ / 右键圈选+松开菜单✓ / 左键圈选(含文件拖拽不误杀)✓
  • AOT quickcheck 绿;零新增本地化键(标签全部 OS 本地化);Win10/Win11/商店三格兼容审计过(runFullTrust、纯注册表读、API 全部早于 min platform 十年)

备注

  • docs/releases/v1.5.9.md 的哈希回填(3275a818 时代构建)刻意未随本 PR——安装包已落后于 name-expand 合并,留给发版重打包日刷新。
  • 工作区尚有三批并行未提交工作(提权知情通知/Updater UX/Peek 改名),不在本 PR 范围。

新建子菜单与资源管理器完全同源:三注册布局枚举(直挂 / .ext\ProgId 嵌套(Office) / ProgId 键,每扩展名首个可用形状赢,VMware 空值键与 Command-only 正确跳过且不遮蔽后来者);命名链=MenuText(间接串解析+剥加速键)→ProgId FriendlyTypeName→ProgId default(SHGFI TypeName 被 UserChoice 带偏禁用,.md "WorkBuddy Document" vs "MD 文件" 实证);排序按扩展名而非显示名(docx<md<…<zip 与原生逐项吻合);ItemName 即新建文件现成基名(新建 ZIP 带 Data 空档头合法可开);每行类型图标走 SHGFI_ICON|USEFILEATTRIBUTES→HICON→IconHelper 现成 PNG 管线,右键时后台预取不卡菜单(ICONLOCATION+USEFILEATTRIBUTES 主流机器大面积空定位,证伪弃用);快捷方式项=rundll32 appwiz 向导在 26xxx 已死(实测立即退出),改 AOT 安全 vtable 建无目标占位 lnk(IPersistFile::Save 槽6)+SHObjectProperties 属性表补目标;近版 Windows 无 .txt ShellNew 注册,以 SHGFI TypeName 兜底播种(顺带修 Win10 txtfile\ShellNew ProgID 布局盲区,老代码只扫直挂布局)。

列表模式右键命中区对齐 Explorer:仅「图标+名称」块(4px 外扩)弹文件菜单,行内其余右键=空白菜单+清选择(与真空白完全同一路径),「查看→图标」从行内随时可达;左右键跑马圈选均可从行内空白起手(DragStarting 待定取消防文件拖拽抢手势,过阈值后指针捕获自防;行内空白左键单击仍由视图内建点击选择回选该行);右键圈选松开就地弹作用于圈选结果的菜单(单选文件菜单/多选菜单/圈空空白菜单),一次性 suppress 吞可能的重复 RightTapped。

根因修复:FindItemElement(DataContext 走查)返回最内层命中元素致 is FileItemSurface 恒假=命中区分流与圈选起手全部死代码(构建含符号但路径不可达,两轮误判后 Simon 实测"都没生效"钉死),新增 FindItemSurface 类型祖先链(同 IsWithinItemSurface 的 Tag 走法先例),契约钉 DoesNotContain 永禁 DC 走查结果做类型判定;顺修 FileItemSelectionGeometryContractTests 嵌套 Fact 正规化(xUnit 实际会运行嵌套 local function 测试)与弹窗菜单定位钉锚随抽取更新(行为未变)。
@Tianyu199509

Copy link
Copy Markdown
Owner Author

工作区内容经 #565 汇聚合并落地(逐文件一致),本 PR 关闭。

pattoneirc pushed a commit to pattoneirc/DeskBox that referenced this pull request Oct 24, 2026
…批(归因体系+弹窗变体+toast 兜底+ack schema15+SearchPopup 守卫+13 语言全键:ElevationNoticeWindow/App.xaml.cs/SearchPopupWindow/13 Strings json+FullyElevatedSessionAttributionTests);PowerToys Peek 空格预览批 A(PowerToysPeekPreviewService+SpacePreviewBroker 仲裁+换线点 WidgetManager.QuickLook 等+21 测试);托盘图标「隐藏」样式批(五值 TrayIconStyle+启动跳建+运行时移除恢复+TaskbarCreated 复活压制+lifeline 隐藏分支:App.Tray/App.Startup);设置门面批(门面棘轮清单扩容 App.xaml.cs 35→36——解 Tianyu199509#564 CI 红因(更新器批 2492c51 新增门面读而清单扩容滞留工作区)+SettingsService 家族+12 契约测试重钉);原生菜单批工作区内容与 PR Tianyu199509#563 分支逐文件一致(汇聚合并,先后任序皆无冲突:新建子菜单同源/列表命中区/双键圈选+CHANGELOG/v1.5.9.md 未覆盖部分(原生菜单文案扩写+重打包登记));更新器六批 2492c51 经本 PR 一并带入远端(本地 release/1.5.9 原领先 origin 1 提交);Win32Helper/IconHelper/Shell* 系为各批交叉改动
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant