Modernize the Windows installer, tray and runtime control; fix lifecycle bugs.

Installer: dynamic light/dark Win11 style, new brand wizard images, auto
language, exclusive run mode (tray / Windows service) plus autostart and
auto-update on the Tasks page (pre-selected from what is installed on
upgrades, untouched by silent updates), 5 localized Start Menu entries.

Tray: theme-aware rounded menu with live status, icons and status-dot tray
icon; health polled off the UI thread; Settings submenu toggles autostart
and daily updates; browser opened de-elevated via explorer.

Fixes:
- tray Stop/Start was ignored in service mode (service_run restarted the
  children) - all start/stop now goes through runtime_ctl.ps1
- logon tray task and SYSTEM service task were killed after 72h (default
  ExecutionTimeLimit); autostart was registered for the elevating account
  and opened a browser on every logon
- uninstall left the NetXTray/NetXUpdate tasks behind
- silent auto-update killed the tray without restarting it
- repair_venv.ps1 was never staged into the release
- wildcard NETX_HOST (0.0.0.0) broke health checks
- ICO frames were PNG, which System.Drawing decodes as noise; icons now
  use the current brand mark

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
oliver 2026-10-13 20:32:33 +08:00
parent 4c4c7d91d0
commit e21719b66c
27 changed files with 1209 additions and 687 deletions

View file

@ -84,11 +84,12 @@ try {
'ResumeAfterUpdate' {
if (-not (Test-Path -LiteralPath $stateFile)) { break }
$state = Get-Content -LiteralPath $stateFile -Raw | ConvertFrom-Json
if ($state.serviceWasRunning) {
# Setup may have switched run mode (service -> tray) in between: skip what is gone.
if ($state.serviceWasRunning -and (Get-Service -Name 'NetX' -ErrorAction SilentlyContinue)) {
Write-LifecycleLog 'Restarting Windows service NetX after update'
Start-Service -Name 'NetX' -ErrorAction Stop
}
if ($state.taskWasRunning) {
if ($state.taskWasRunning -and (Get-NetxTask)) {
Write-LifecycleLog 'Restarting scheduled task NetXService after update'
Start-ScheduledTask -TaskName 'NetXService' -TaskPath '\NetX\' -ErrorAction Stop
}
@ -96,6 +97,17 @@ try {
}
'RemoveForUninstall' {
$null = Stop-NetxRunners -Remove
# Logon tray + daily update tasks would otherwise outlive the program files.
foreach ($t in @('NetXTray', 'NetXUpdate')) {
Unregister-ScheduledTask -TaskName $t -TaskPath '\NetX\' -Confirm:$false -ErrorAction SilentlyContinue
}
try {
$sched = New-Object -ComObject Schedule.Service
$sched.Connect()
$root = $sched.GetFolder('\')
$nx = $root.GetFolder('\NetX')
if ($nx.GetTasks(1).Count -eq 0 -and $nx.GetFolders(0).Count -eq 0) { $root.DeleteFolder('NetX', 0) }
} catch {}
$stopScript = Join-Path $prog 'packaging\stop_netx_app.ps1'
if (Test-Path -LiteralPath $stopScript) {
& powershell.exe -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File $stopScript `