[2.0.0] - 2026-06-13
Added
- Elevated-window detection — when a window running as administrator is focused,
the filter's low-level hook is bypassed for it by Windows (UIPI). The app now
detects this and reflects it non-disruptively: the tray icon turns yellow with a
plain-language tooltip, a brief self-drawn corner notification appears each time
focus moves to an elevated window (it does not steal focus and does not depend on
Windows notification settings), and the transition is recorded in the log
(HookBypass/HookActive). It returns to normal automatically when a
non-elevated window is focused. The popup can be turned off with the
ShowElevatedWindowNoticeconfig setting (default on) or the new
"Disable nag popups" tray menu item, which persists the choice to
config.json; the icon and log are unaffected. - KeyboardHeatmap surfaces config warnings —
ConfigWarninglog lines (emitted when
config.jsoncontains an unrecognized key name) are now parsed and shown as a banner in
the HTML report and a line in the console output, so typos in key names are noticed instead
of silently ignored. - Friendly key names in
config.json—ExcludedKeysandPerKeyMinRepeatIntervalMs
now accept key names (e.g."Back","Return","I","LCONTROL") as shown in the log,
with theVK_prefix optional and case-insensitive matching. A generic modifier
("Ctrl","Shift","Alt") expands to both the left and right keys; use
"LCONTROL"/"RCONTROL"etc. to target one side. Numeric VK codes still work, and the
legacyExcludedVkCodesarray is still honored. Unrecognized names are ignored and
reported as aConfigWarningin the log. FilterModeconfig switch — choose how a stutter is filtered:BlockRepress(default) blocks the duplicate key-down, preserving the
original behavior. Best for character keys.BlockReleasewithholds the spurious key-up so a held key stays logically
pressed through a bounce. Best for held modifiers (Ctrl/Shift) and game
movement keys, at the cost of deferring each release by up to the threshold.- Switchable at runtime from the Filter mode tray submenu (radio choice),
which persists toconfig.jsonand applies immediately.