Repository navigation
[Windows] dsh-native-command 把 windowsHide 用在 GUI 程序上:窗口被创建成隐藏态,并导致整个目录后续无法打开 #7021
yangzeusyong-creator
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh-native-command现象
两个不同按钮都会出现「点了没反应」,且同一个会话目录坏了之后,所有方式都打不开它:
revealNativePath)openNativePath)症状特征:HTTP 返回成功(204 /
{ok:true})、无任何报错、但屏幕上什么都不出现。根因:一个根源,三处缺陷
根源是
windowsHide: true被应用到了 GUI 程序上。它本该只隐藏控制台窗口(避免 pwsh 闪黑框,参见 #1344 / #1102 / #1142 那一批讨论),但被同时用在了
explorer.exe和powershell.exe上。对 GUI 程序而言,Node 会把它转成STARTUPINFO.wShowWindow = SW_HIDE—— 于是窗口被创建/继承成隐藏状态。缺陷 A —
pathToFileURL的结果交给/select,revealNativePath()用pathToFileURL(windowsPath).href把路径变成百分号编码的file:URL,再交给explorer.exe /select,,而后者需要的是文件系统路径。Explorer 无法解析 → 静默回退打开「桌面」。中文 →
%E4%B8%AD,空格 →%20。(此点已由社区插件
HeJian2002W/dsh-reveal-fix独立确认,结论一致。)缺陷 B —
runNativeCommand硬编码windowsHide: trueexplorer.exe是 GUI 启动器而非控制台程序。隐藏它 = 隐藏它正要显示的那个窗口。窗口被创建成SW_HIDE状态,IsWindowVisible()返回false。缺陷 C —
openWindowsPath走Invoke-Item,窗口继承隐藏态powershell 被
windowsHide隐藏(这对控制台程序是正确的),但它打开的文件夹窗口继承了该隐藏状态 → 又产生一个隐藏窗口。为什么危害会扩散:「隐藏窗口毒化目录」
隐藏的文件夹窗口看不见、关不掉,会常驻(每个约 180MB)。而 Windows 按目录复用文件管理器窗口 —— 之后无论用什么方式打开那个目录,都只是「激活那个已存在的隐藏窗口」,于是看起来什么都没发生。
后果:
实测证据
判定标准必须用
IsWindowVisible——Shell.Application.Windows()会列出隐藏窗口,靠计数无法区分可见与否:在干净重启的 explorer shell 上,每条路径各触发 3 次:
revealNativePath(交付卡片)openNativePath(右上角)A/B 单变量对照(同一命令,仅改一个变量):
pathToFileURL().href→/select,Desktop/select,windowsHide: trueIsWindowVisible = FalsewindowsHide: falseIsWindowVisible = Trueexplorer.exe /n,<dir>为什么这个 bug 极难诊断
三者叠加使故障完全静默:
explorer.exe无论成败退出码恒为 1(上游已将其视为「委派交接」吞掉)建议修法(三处,均已实测)
①
runner.ts— GUI 启动器不隐藏(
powershell.exe不在此白名单 → 仍保持true,控制台窗口照常隐藏。这样 #1344 那批问题仍能规避。)②
path-opener.ts—revealNativePath传纯路径③
path-opener.ts—openWindowsPath按类型分流,目录走 explorer/n/n的作用是强制新窗口:即使目标目录已被毒化(已存在一个隐藏窗口),也能开出可见窗口。补充建议
考虑在 Desktop 场景改用 Electron 原生 API。 桌面壳自身已在用
shell.showItemInFolder()/shell.openPath()(例如菜单「显示日志」),工作完全正常 —— 它不创建子进程、不受windowsHide影响。若 Host 的 reveal/open 调用能通过壳层桥接,可根治这一整类问题。openWindowsPath对powershell.exe的依赖也可一并优化:参见zhu1090093659/dsh-web#395,那里踩的是同类调用方式的另一个坑(cwd传入了带/select,前缀的假路径)。与已有讨论的关系
本 issue 与 #1344 / #1102 / #1142 是同一机制的两个相反方向:
SW_HIDE把控制台藏起来windowsHide落到 GUI 程序上的副作用也就是说:
windowsHide对控制台程序完全正确,只是不该无差别地作用于 GUI 启动器。All reactions