All notable changes to ControlNav will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
- Self-elevate at launch via manifest-based
uiAccess="true"so ControlNav can interact with higher-integrity windows (NVDA, JAWS, Narrator, UAC dialogs). Same mechanism the screen readers themselves use — Medium Integrity with UIPI bypass, no UAC prompt, no admin requirement, Store-compatible (Accessibility category). - Type-aware default Enter action — activates buttons, toggles checkboxes, expands/collapses combo boxes, selects radio buttons / tab items, and scrolls items inside virtualized containers into view before acting.
- Semantic dispatch for selection containers (Tree / List / DataGrid /
Table / Tab strip): focus follows the current selection or the first
real item, using
SelectionItemPattern.Select()where available so screen readers announce the full row rather than an inner button. - Show panes and groups in the control list, not just leaf controls; clicking a pane focuses it instead of firing a synthetic mouse click at a random child.
- Side-by-side hero screenshot showing a sample login dialog next to ControlNav's control list, so a reader can map each source control to its row at a glance.
Changed
DoubleClickControlno longer toggles first — order is now Invoke → ExpandCollapse → mouse double-click, matching the conventional "open / activate" meaning of double-click on list and tree items.- Action is executed after the control-list dialog closes so the target window has regained focus before the click/focus is sent.
Fixed
- BM_CLICK fast-path for native Win32 buttons in
ClickControl. The UIA InvokePattern path silently no-ops on some wxPython buttons (e.g. Close in NVDA's Add-on Store); BM_CLICK fires the framework's button handler reliably for push buttons, checkboxes, and radio buttons. - Use the native HWND directly for button activation when one is available, avoiding cross-thread COM issues that intermittently swallowed the click.
- Control discovery now always runs the HWND enumeration as a supplement to the UIA tree walk (deduplicated by HWND). Fixes missing controls in NVDA's Add-on Store and other wxPython dialogs where the UIA tree is sparse.
- Static-label fallback: controls with an empty UIA name inherit the preceding "Label:" Static text as their display name, so screen readers see something meaningful instead of a blank row.
- Empty VNC Viewer panes no longer pollute the list.
Accessibility
- Runtime light/dark theme switch —
WM_SETTINGCHANGE("ImmersiveColorSet") rebuilds the dark-mode brush so subsequently opened dialogs follow the new theme without restarting the app. - Readable checkbox and radio labels in dark mode. Themed Button
controls were forcing black labels (invisible on dark background)
via
DrawThemeText; replaced with a subclass that overdraws the label area in white after the default paint. - Audible language-change preview — confirming a new language in Settings opens a small dark-mode-aware dialog whose caption, message, and buttons are rendered in the just-selected language, so a screen reader speaks the prompt in the new language before the change is committed. Default focus is "No" so Enter/Esc keep the safe choice.
Localization
- New marketing tagline "Tired of tabbing endlessly?" translated into all 8 supported languages.
- Store listing copy localized for all 8 languages (EN, DE, ES, FR, IT, NL, PT, JA).
- Installation guide rewritten for Store-only distribution in all languages.
[1.2.0] — 2026-03-09
Added
- Singleton support: launching a second instance now gracefully replaces the running one.
--theme light|darkCLI flag for per-instance theme override (intended for screenshot automation).- Automated screenshot capture via
scons screenshotscovering all dialogs in both light and dark mode.
Fixed
- SVG icon rendering at small sizes — downscaled from native resolution so toolbar / tray icons stay sharp.
Localization
- Fixed missing translations across all 8 languages and corrected terminology inconsistencies in tray menus and dialog strings.
[1.1.2] — 2026-02-07
Fixed
- Control discovery for wxPython apps (e.g. NVDA Preferences) where
the UIA tree structure is broken: when the UIA tree walker finds
zero controls, ControlNav now enumerates child windows directly via
EnumChildWindowsand resolves UIA elements per HWND. Internal container Pane controls are filtered out of the fallback path to keep the list clean.
[1.1.1] — 2026-01-25
Localization
- UTF-8 encoding for non-ASCII characters in the resource file (German umlauts in dialogs now render correctly).
- Unicode escape sequences in runtime localized strings (tray menu,
tooltips) — switched
\xto\uescapes to avoid greedy hex parsing in C++ string literals.
[1.1.0] — 2026-01
Added
- Welcome dialog with "Don't show at startup" checkbox, gated by a
welcomeShownregistry flag for first-run detection. - About dialog with a "Show Welcome" button to re-display the welcome message.
- Settings dialog: Apply button (save without closing), Reset to Defaults button, and a native Windows hotkey control for easy shortcut configuration.
- Lazy loading — control enumeration runs on a background thread with progressive population. The dialog opens immediately with a status indicator and controls fill in as they're discovered. Handles applications with 1000+ controls smoothly.
- Dark mode support for all dialogs, following the Windows theme setting.
Changed
- Default global hotkey changed from
Ctrl+Alt+UtoCtrl+Alt+L. - Settings dialog now uses the native Windows hotkey control instead of a text input.
Fixed
- GroupBox frame crossing through label text in dark mode.
- Checkbox text visibility in dark mode.
Accessibility
WS_TABSTOPadded to text labels for screen-reader tab navigation.- Tab navigation through all controls verified across all dialogs.
Localization
- Expanded from 2 to 8 languages: English, German, Spanish, French, Japanese, Portuguese, Italian, Dutch. All dialogs and runtime strings fully translated.
[1.0.0] — 2025-01-20
First official public release. Pure Win32 C++20 implementation, zero external dependencies, x64, Windows 10 1809+.
Added
- Global hotkey (
Ctrl+Alt+L) to activate the control list from any application. - Real-time UI control enumeration via Windows UI Automation.
- Searchable ListView with control names and types, with real-time filtering that updates as you type.
- Arrow-key navigation inside the filter textbox.
- Three control interaction modes:
- Click — activates buttons, links, menu items
(
InvokePatternwith mouse-click fallback). - Double Click — toggles checkboxes, expands tree items
(
TogglePatternwith double-click fallback). - Focus — moves directly to edit boxes and combo boxes.
- Click — activates buttons, links, menu items
(
- System tray icon with context menu.
- Settings dialog (default action, auto-start with Windows, language)
with persistence in
HKEY_CURRENT_USER\Software\ControlNav. - About dialog with version and copyright information.
- Welcome dialog on first run.
- Auto-start with Windows via registry.
- Modal dialog detection.
- Display-name fallback for WPF apps with empty
Nameproperty. - HWND fallback when the UIA tree returns no controls.
- Coverage for 30+ control types (Button, CheckBox, ComboBox, Edit, ListItem, TabItem, Hyperlink, MenuItem, RadioButton, ScrollBar, Slider, Spinner, SplitButton, StatusBar, Tree, TreeItem, …). Text and Window control types are excluded from listings.
Accessibility
- Full screen-reader support for JAWS, NVDA, and Windows Narrator.
- WCAG 2.1 Level AA and Section 508 compliance targets.
- Keyboard-only navigation; no mouse required.
- Screen-reader announcements on arrow-key navigation via UIA live
region events and
IAccPropServicesLiveRegionAPI. - Enter key reliably executes the default action after arrow-key navigation.
LVS_SHOWSELALWAYSso the ListView selection stays visible when focus is on the filter textbox.
Localization
- Full English (US) and German (Standard) translations with a user-selectable language preference. Bilingual dialogs and context menus.
Security
- No telemetry. No network access. Settings stored locally in the Windows Registry only (HKCU).