Repository navigation
Replies: 3 comments 2 replies
|
补充:现象是间歇的 有反馈说这里其实「有时候能上前台」。补测后确认:点通知后窗口是否上前台不稳定,有时会,有时只切换会话。把 |
|
补充一组实测(同版本:DSH Desktop 0.2.1-rc.2 / Windows 11 26100),有两点想修正和补上。 1. 「ForegroundLockTimeout = 0 可以排除前台锁」可能偏乐观我直接拿 Win32 在同一个后台 PowerShell 里试了五种抬窗手法(窗口状态分两种;
结论:只要窗口没最小化、而前台是别的应用, 对修复的直接影响:就算官方补上 IPC,实现里也别只写一句 2. 官方 IPC 落地前,网页层已经有可用绕法我在本机跑通了一条不需要改官方代码的路子,供其他通知插件作者参考:
实测结果(走真实 HTTP 路由,非直调): 页面的 3. 建议的 API 形状(贴合现有 preload 约定)
// preload-app
window.dshDesktop.window = {
focus: () => ipcRenderer.invoke(DESKTOP_IPC.windowFocus), // restore → show → focus
isMinimized: () => ipcRenderer.invoke(DESKTOP_IPC.windowIsMinimized),
}主进程侧复用现成约束: 4. 一个现成的正例,说明能力已经有了壳自己已经在主进程里弹带点击回调通知: 备注
|
|
@chromoany 谢谢复测,三处都对上了,第 2 条顺着你的提醒改了一版。 关于第 2 条(Origin 拿不到):你说得对, 实测(Windows 11 / 0.2.1-rc.2,走真实路由): 注意 关于第 1 条:我实现里的顺序和你测出来的一致—— 关于第 3 条:赞同 一个提醒: |
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh-desktop0.2.1-rc.2(app.asar内package.json)dsh-app://app/主框架)里的系统通知,来自第三方插件 dsh-notify-me现象
桌面端窗口被其他窗口盖住或最小化时,点击 Windows 通知横幅,窗口不会回到前台。通知的
onclick确实执行了,navigator.userActivation.isActive === true、document.visibilityState === "hidden",属于真实的用户激活;但页面里window.focus()对 Electron 原生窗口无效,也没有其他可用通道。复现 A:系统协议
ShowWindow/WM_SYSCOMMAND SC_MINIMIZE均可)。"<install-dir>\DeepSeek Harness.exe" dsh://openIsIconic仍为True。对照:不带任何参数重复第 3 步,第二进程约 258 ms 后以退出码 0 退出(正常的单实例让位),但最小化的主窗口依然没有恢复。
复现 B:页面内深链导航
页面里用隐藏 iframe 导航
dsh://open(放在通知点击的激活窗口内)没有任何效果;lib/main.js:12032的will-navigate只放行dsh-app:和同源 http,dsh:一律preventDefault(),并且只有 http(s) 才转shell.openExternal——从网页层这条路也走不通。相关代码位置(0.2.1-rc.2)
lib/main.js:12032主窗口will-navigate守卫:非dsh-app:且非同源 http 的方案一律拦截。lib/main.js:13056app.on("open-url")处理dsh://open→focusPrimaryWindow(),仅 macOS。lib/main.js:7658claimDesktopSingleInstance():requestSingleInstanceLock()失败即application.quit(),否则application.on("second-instance", focusOwner)。lib/main.js:13184调用点传入() => focusPrimaryWindow()。lib/main.js:13031focusPrimaryWindow():if (window === mainWindow && !enteredWorkspace) return;之后才restore()/show()/focus()。lib/preload-app.cjs暴露面只有dshOnboarding、__DSH_DIRECTORY_PICKER__、__DSH_HOST_PATHS__、dshDesktopBoot、dshPlatform、dshDesktop、__DSH_LOCALE__;DESKTOP_IPC里没有 focus/raise 类通道(windowFullscreen只用于接收状态)。推断:Windows 上带
dsh://open的第二进程在进入单实例判定之前就以退出码 1 结束,主进程收不到second-instance,focusPrimaryWindow()不会执行;而无参重启虽然正常让位、second-instance应已到达,但最小化窗口实测仍未恢复,说明focusPrimaryWindow()内部早退(enteredWorkspace门控或welcomeWindow分支)。期望行为
点击系统通知(或任何用户主动触发的深链)后,应用窗口应当像其他 Windows 程序一样被带到前台;最小化时先恢复。
建议
dsh-app://app主框架调用的 IPC(例如DESKTOP_IPC.focusWindow),实现if (win.isMinimized()) win.restore(); win.show(); win.focus()。这样网页里的通知点击就有正规通道,不必依赖协议导航。dsh://open的第二实例路径:确认带协议参数时为什么会以退出码 1 提前退出;并在second-instance回调里显式处理 argv 中的深链而不是一律「聚焦主窗口」。focusPrimaryWindow()对「用户主动唤醒」场景不要早退:至少在没有可见窗口时执行show()/restore(),或按需createMainWindow()。备注
macOS 走
open-url,Windows 只能走second-instance,所以这更像是 Windows 分支的问题,不是配置问题。All reactions