Files
Scoreboard/console/installer
AskaEth 67eadd7fe6 fix(installer): 真机四条 UI 问题 + 提权改为 highestAvailable
主人真机实测报出四个问题,全部只有在真 Windows 上才暴露(wine 渲染/移动循环/UAC/插件卸载时序都不同):

1. **窗口拖不动**:原来把移动交给 DefWindowProc 的移动循环(ReleaseCapture + WM_NCLBUTTONDOWN HTCAPTION),
   我们摘掉了 WS_CAPTION,真机上那个循环不启动。改成自己算位移:按下时记锚点(GetCursorPos + GetWindowRect),
   之后每个 tick 用 SetWindowPos 跟光标走。注意起拖后不能因为光标甩出标题栏就停(否则变成「拖一下就断」)。
2. **原生按钮透出**:内层对话框只「盖住」了原生控件,鼠标划过时按钮自己重绘就露出来。现在每页显式隐藏
   11 个原生 ID(Next/Cancel/Back + 品牌字 + 页眉),并断言 IsWindowVisible 为假;隐藏后 BM_CLICK 翻页仍有效。
3. **P3 点下一步闪一下没反应**:不是目录校验,是提权失败分支末尾的 Abort(默认选中「为所有用户安装」时
   真机必然走到)。现在不再 Abort,降级为按用户安装并弹一句说明后继续。
4. **退出时弹 StdUtils::TimerCreate「Plug-in unloaded before all timers were destroyed」**:
   定时器从来没销毁过。加哨兵 $timerOn,在 .onGUIEnd 与 MUI_CUSTOMFUNCTION_ABORT 两条退出路径上幂等销毁;
   定时器全程只建一次(翻页不叠加)。对照实验:把销毁段掏空即复现该报错窗口。

**提权策略**(主人拍板「一启动就提权」):RequestExecutionLevel highest。
原先没写这条指令时 NSIS 默认是 requireAdministrator —— 受限账户机器上根本起不来;highest 在管理员机器上
行为与 admin 完全一致(启动即 UAC、全程提权、防火墙必然放行),但给受限账户留了降级路径。
同时去掉 P3 的中途 UAC_RunElevated(那正是「闪一下没反应」的来源)。

验证(wine):五页走完 + 点完成/点 ✕ 退出均无 StdUtils 报错;原生按钮 vis=000;拖动位移精确;
/S /currentuser /D=... 与 /S /D=...(非提权时降级按用户)都 exit 0 且写出真卸载器。
UAC 本身与四条观感须真机复验。
2026-09-13 16:49:20 +08:00
..
…