Repository navigation
Remote Controls V2.3.7
🚀 自动构建发布 - 2025-11-09 09:51 UTC
🔄 更新内容
托盘在“任务计划 + 最高权限”场景下的通知稳定性修复
Full Changelog (相对于 2.3.6): V2.3.6...V2.3.7
🐛 关键问题修复
- 修复在“任务计划程序以最高权限运行”场景下,托盘在点击菜单(例如“打开配置界面”“托盘状态”等)触发通知时偶发崩溃并弹出“Error launching CrashSender.exe”的问题。
- 根因:
win11toast依赖的 WinRT 调用在提升会话中由winsdk\_winrt.pyd原生层崩溃(0xC0000005),Python 无法捕获,最终由 PyInstaller 试图拉起 CrashSender 导致提示。 - 事件验证:事件查看器显示 Faulting module 指向
winsdk\_winrt.pyd,异常码 0xC0000005,与现场一致。
- 根因:
🔧 解决方案与实现
- 新增“模拟桌面用户令牌(Impersonation)”机制:
- 在托盘为管理员权限时,通知线程临时模拟当前登录桌面的
explorer.exe用户令牌,再调用 WinRT 发送 toast,调用完成即恢复线程令牌。 - 该机制对普通权限运行无影响,仅在提升会话时启用。
- 在托盘为管理员权限时,通知线程临时模拟当前登录桌面的
- 新增通知熔断保护:
- 一旦首次通知调用失败(包括 WinRT 初始化失败等),自动禁用本进程后续 toast,改为日志/MessageBox 回退,确保不再被原生崩溃拖垮。
🗂 变更范围
tray.py- 新增
_impersonate_shell_user()辅助方法(基于DuplicateTokenEx+SetThreadToken)。 notify()统一通过模拟令牌发送 toast,并内置失败熔断与降级路径。
- 新增
✅ 兼容性与用户影响
- 无需修改任何配置;保留系统通知体验,即便托盘由“任务计划 + 最高权限”启动也不会崩溃。
- 普通权限下行为不变。
🔎 建议验证
- 在任务计划程序勾选“使用最高权限运行”,设置登录后触发/开机触发,启动托盘后:
- 依次点击“托盘状态”“打开配置界面”等,toast 能正常显示,托盘不退出。
- 如个别环境仍有第一次 toast 失败,后续应用将自动熔断到安全回退,不再崩溃。