Repository navigation
Tags
Tags
Add Restart as Administrator and leave Task Manager's pinning to itself Global hooks from a non-elevated process never load into elevated windows (Task Manager, admin consoles, ...), so those got none of our system menu items. The tray menu now has a Restart as Administrator item, shown only when not already elevated, that relaunches through UAC and hands off like a self-update: hidden windows stay hidden and the new instance picks them back up. The tray tooltip says "(Administrator)" when elevated. Task Manager keeps its own persisted Always on top setting that nothing outside it can read or change, so toggling its topmost state ourselves just left the two out of sync. Its system menu no longer gets our Always on Top item (Hide Window and Hide in Tray remain), and Manage Windows never lists it as pinned. Bump version to 0.6.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace tray-icon toggle with a separate Hide in Tray action Instead of a global tray-menu toggle deciding whether every hidden window gets a tray icon, the system menu now has its own Hide in Tray item next to Always on Top and Hide Window. Windows hidden that way are tagged with an extra property and get a tray icon; plain Hide Window no longer creates one. This lets important windows sit one click away in the tray while irrelevant ones are hidden completely. The "Hidden Windows in Tray" menu item and its registry setting are removed. The tray sync timer now only runs while there are tray icons to keep in sync, and Manage Windows shows "Hidden in Tray" for those windows. Bump version to 0.5.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Give the hook DLL a per-version filename to fix self-update failures Root-caused the "update downloads but never applies" reports: the hook DLL is injected via global hooks into essentially every window-owning process (confirmed ~19 processes - Brave, Discord, svchost, etc. - still had it mapped after this app's own unhook+FreeLibrary). Windows only releases each process's mapping lazily, so renaming/replacing the DLL in place failed with ERROR_ACCESS_DENIED as long as any straggler still had the old copy open, silently rolling the update back with no indication to the user. Give the DLL a version-suffixed filename (AlwaysOnTopHook-<version>.dll) via the CMake target's OUTPUT_NAME. An update now only ever adds a new file under its own version's name instead of touching one that might still be in use - nothing to rename or delete. The exe is unaffected (only this process ever loads it) and keeps the existing rename-in-place swap, now with retries for transient AV-scan locks on the fresh download and a failure balloon plus hook reinstall if it still doesn't work out. Stale hook DLLs (including the old fixed-name one) are swept up on startup once nothing still has them mapped. Bump version to 0.4.6.
Stop self-update from restoring every hidden window on the desktop Releasing the hook DLL for an in-place update called the same teardown used on real quit, which walks every top-level window and force-shows any it had hidden via Hide Window, clearing their hidden marker in the process. That could unhide unrelated windows (e.g. a browser) mid-update. Split the DLL teardown into an unhook-only export used during self-update (leaves window state untouched, since the relaunched process picks the same windows back up) and the full stop-and-restore used on actual quit. Bump version to 0.4.5.
Fix duplicate separator in Chromium system menu rebuilds When a host rebuilds its native system menu (e.g. Brave) without removing our stray separator, we were appending a second one on top of it. Skip re-adding the separator if the menu's last item already is one. Bump version to 0.4.4.
PreviousNext