Repository navigation
Replies: 1 comment
|
确认了,你标的根因在
SHAssocEnumHandlers(extension, 0, out handlers);第二个参数就是过滤档, 一个小差别:你读的是发布包里编译过的 你第 7 节那个倒退提醒是对的,而且它不是"可能",是必然—— 有个实现位置的问题,我觉得比改哪个常量更要紧。 再补一个你两张表之外的点: 影响面你那节也对上了: |
|
确认了,你标的根因在
SHAssocEnumHandlers(extension, 0, out handlers);第二个参数就是过滤档, 一个小差别:你读的是发布包里编译过的 你第 7 节那个倒退提醒是对的,而且它不是"可能",是必然—— 有个实现位置的问题,我觉得比改哪个常量更要紧。 再补一个你两张表之外的点: 影响面你那节也对上了: |
Uh oh!
There was an error while loading. Please reload this page.
分类: Bug 报告
组件:
@deepseek-ai/dsh-native-command(Windows 文件关联枚举)、@deepseek-ai/dsh-client-ui-open-in-app(菜单渲染与空列表回退)、@deepseek-ai/dsh-api-session-controller(workspacePathApplications路由)版本: DSH 桌面端 0.2.0-rc.2(Electron 44.0.0 / Node 24.18.1)
平台: Windows 11 x64
English abstract: On Windows, the file "Open with" menu (
dsh-client-ui-open-in-app) lists every registered shell handler instead of the recommended ones, becausedsh-native-command's Windows adapter callsSHAssocEnumHandlers(extension, ASSOC_FILTER_NONE /* 0 */, ...)and never consults theIHandler::IsRecommended()it already declares. Measured on one machine: a.xlsxyields 17 entries with filter 0 vs 2 withASSOC_FILTER_RECOMMENDED. Note a naive0 → 1change regresses file types whose recommended set is empty (.json,.et, …): the dropdown disappears and the main button degrades to "reveal only" — recommend a fallback to the full list when the recommended set is empty.1. 环境
@deepseek-ai/dsh-desktop0.2.0-rc.2dsh-client-ui-open-in-app0.2.0-rc.2、dsh-host-open-in-app0.2.0-rc.2、dsh-native-command0.2.0-rc.2、dsh-api-session-controller0.2.0-rc.22. 现象
在文档预览(右侧栏)的「打开」分体按钮上点下拉箭头,菜单列出 17 个应用:
其中大部分(百度网盘两个 exe、夸克、千问、MuMu、Adobe 两件套、Office 的三个转换组件
excelcnv.exe/WORDICON.EXE/Wordconv.exe、旧版 WMP)并不会打开.xlsx,只是把自己注册成了"通用打开程序"。作为对照,改用 Shell 的"推荐"档(
ASSOC_FILTER_RECOMMENDED,即系统自带「打开方式」界面所用的档位)枚举同一个文件,只得到 2 项。用户预期:只列真正能打开该格式的应用 + 底部固定的「显示文件位置」。3. 复现步骤
HKEY_CLASSES_ROOT\Applications\<exe>下写shell\open\command,但既不写SupportedTypes(不限定格式),也不写NoOpenWith(不退出列表)。iexplore.exe、provtool.exe、系统notepad.exe都带NoOpenWith=1,它们不会出现在菜单里——说明枚举结果确实受这些注册约束。.xlsx(.xls/.csv同样),在 DSH 文档预览里点「打开」下拉箭头。4. 根因定位
调用链:
包内路径:
@deepseek-ai/dsh-native-command/lib/types/file-applications-windows.js第 183 行(根因):
SHAssocEnumHandlers的第二个参数是过滤级别:ASSOC_FILTER_NONE = 0x0—— 返回全部已注册处理器ASSOC_FILTER_RECOMMENDED = 0x1—— 只返回推荐处理器(系统自己的「打开方式」界面用的就是这一档)同一文件第 26 行已经声明了
[PreserveSig] int IsRecommended();,但整个文件从未调用它——拿得到"是否推荐"的信息却没有用来过滤。5. 实测对照
用该文件内嵌的同一段 C#(含
Add-Type -ReferencedAssemblies System,System.Core,System.Drawing、-STA)在本机枚举:.xlsx:filter = 0→ 17 项(即上面那串)filter = 1→ 2 项(Excel、Kimi)跨扩展名(
filter 0 / filter 1):.xlsx.json.xls.md.xlsm.xlsb.csv.ods.txt.et(WPS).png.zzz/.foo/.tmp.pdf.docx补充:探针单次耗时 0.4–0.5 秒,连续多次运行结果完全一致,可排除超时/不稳定的可能;
.zzz这类无关联扩展名同样返回 14 项,说明"通用打开项"对任意扩展名都被算作候选。6. 期望行为
菜单只列出被 Shell 标记为"推荐"的处理器,再加上固定在底部的「显示文件位置」。
7.⚠️ 修法提醒:直接改常量会造成功能倒退
如果只是把第 183 行的
0改成1,会出现新的问题。dsh-client-ui-open-in-app的OpenTargetButton中:当推荐档为空(
applications.length === 0)时:hasMenu为false→ 下拉箭头整个不渲染;revealDefault为true→ 主按钮变成只执行「显示文件位置」。即:用户连"用默认应用打开"都点不到。上表里
.json、.et(WPS 表格) 在filter = 1下正好返回 0 项,会命中这个分支——这是实打实的功能倒退,比"菜单太长"更严重。因此建议的修法是:优先使用推荐档;当推荐档为空时回退到完整列表。(或保留完整列表,但把
IsRecommended() == false的条目排到后面/折叠起来。)如果产品上确实有意展示全部处理器,至少把推荐档作为默认,并提供设置开关。8. 影响面
dsh-client-ui-deliverables的deliverables.file.actions→FileRouteAction→GET /api/present.open,该路由同样返回workspacePathApplications的结果)。9. 最小验证脚本
把下面这段存成
.ps1,-Path指向任意.xlsx,即可对比两档过滤(ASCII 文件名即可,扩展名是唯一输入):调用方式(必须
-STA):10. 附:注册表侧证据(节选)
其中
dsh-client-ui-open-in-app的 README 已写明"文件菜单列出已发现的关联应用,不单列『用默认应用打开』",与当前实现一致;问题只在于"关联应用"的取法用了最宽的过滤档。本报告由用户与 AI 协作排查后整理。第 5、7 节的数字均为在本机按上述脚本实测所得,可复现下为附图。

All reactions