A Windows accessibility tool. Hold a modifier key, point at any text on screen, and see it rendered large in a floating overlay — using the real text content (via UI Automation), not a blurry pixel zoom.
KeyboardHook.csinstalls a global low-level keyboard hook and firesKeyDown/KeyUpwhen Left Ctrl (the default trigger) is pressed/released.- While held,
App.xaml.cspolls the cursor position every ~60ms (GetCursorPos). ElementTextExtractor.csasks Windows UI Automation (via the FlaUI wrapper) what element is at that point, and pulls its text — tryingTextPattern, thenValuePattern, then the accessibleName, thenHelpText, in that order.OverlayWindow.xamlshows that text in a large, borderless, click-through, always-on-top popup near the cursor.- A tray icon lets you see it's running and exit.
This re-renders the actual text content, rather than screen-zooming like Windows Magnifier does — so text stays crisp at any size.
- Windows 10 or 11
- .NET 10 SDK
- Visual Studio 2026 (recommended) or just the
dotnetCLI - Internet access to restore the FlaUI NuGet packages on first build
Visual Studio: open the folder, let it restore NuGet packages, press F5.
CLI:
dotnet restore
dotnet run
There's no visible main window — check the system tray for the icon once it's running.
The repo ships a per-user installer (installer/installer.iss) that installs
the app to %LocalAppData%\Programs\HoverText, adds a Start Menu shortcut,
registers it in Settings → Apps → Installed apps for uninstall, and offers
a "Launch with Windows" install-time checkbox.
Build it locally (needs Inno Setup, e.g.
winget install JRSoftware.InnoSetup):
dotnet publish HoverText.csproj -c Release -r win-x64 --self-contained false -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o bin/Release/publish
"C:\Users\<you>\AppData\Local\Programs\Inno Setup 6\ISCC.exe" installer\installer.iss /DAppVersion=1.0.0
Output: bin\Release\installer\HoverTextSetup-<version>.exe.
GitHub Actions builds and attaches the installer to every v* release tag.
- Launch the app (tray icon appears).
- Hold Left Ctrl and move your mouse over any text — button labels, paragraphs, tooltips, menu items, form fields.
- Release Left Ctrl to hide the popup.
- Right-click the tray icon → Options... to tweak behavior, or Exit to quit.
Right-click the tray icon → Options.... Every change applies immediately
and is saved to %LocalAppData%\HoverText\settings.json.
- Trigger keys — click Change... and press any key or chord you want to hold (e.g. Left Ctrl, Ctrl+Shift). Enter finishes, Esc cancels. Re-applied live.
- Font size / Max width / Gap below cursor — overlay sizing and how far it sits from the pointer.
- Theme — Dark (default) or Light.
- Keep overlay anchored over the same text — on (default): the popup stays put while the text under the cursor is unchanged. Off: it always re-centers under the cursor.
- Copy hovered text to clipboard on release — release the trigger to copy whatever text was last shown.
- Launch at startup — registers/unregisters the app under
HKCU\...\CurrentVersion\Run.
Anything not exposed in the options window still lives in Config.cs:
Config.cs— every tunable constant (trigger key, poll interval, overlay size, offsets, max text length). Change knobs here, not in the logic files.
- Electron/Chromium apps (Slack, Discord, VS Code, most browsers) often need accessibility support explicitly enabled by the app, and even then expose a thinner tree than native apps — expect inconsistent results.
- Canvas-rendered UI (games, some custom-drawn apps) exposes no
accessible text at all via UIA. A real fix would add an OCR fallback
(e.g. Windows' built-in
Windows.Media.Ocr) when UIA comes back empty — not implemented here. - Elevated (Admin) apps: Windows blocks non-elevated processes from inspecting elevated ones. If you need this to work over an app running as Administrator, run Hover Text as Administrator too.
- No triple-press "lock" mode (toggle without holding the key down) —
straightforward to add to
KeyboardHookif wanted. - Font/weight/color of the original text isn't preserved — UIA gives you the string content, not its original styling, so everything renders in the overlay's own font.
- No pointer-based color picker — could be added by sampling the pixel
under the cursor with
GetPixel.
This is an MVP with no automated tests; verification is "it compiles and runs". UIA quirks vary wildly across apps, so if you hit an app that yields no text, the likely culprits are FlaUI pattern access or an app that doesn't expose its UI tree.
Released under the MIT License.