microsoft / microsoft/react-native-windows
Fabric: activating the window doesn't announce the window or the focused control to a screen reader
Nobody has claimed this yet.
- Dominant language
- C++
- Stars
- 17.3k
- Forks
- 1.2k
- Avg merge
- 1d 13h
- Merged PRs (30d)
- 33
Description
Problem Description
When a Fabric app is activated, NVDA reads only the window title. It doesn't say "window" after the title, and it doesn't announce the control that has focus. On Paper both of those happened.
I hit this building my own app and assumed I'd wired something up wrong. Then I realised both versions of React Native Gallery are on the Store, so it's easy to compare Paper and Fabric side by side without building anything.
Speech captured from NVDA's Speech Viewer while switching into each app:
React Native Gallery (Legacy), Paper/UWP:
React Native Gallery (Legacy)
React Native Gallery (Legacy) window
Navigation bar button
React Native Gallery, current Fabric build:
React Native Gallery
My app on RNW 0.84.0:
GitApp
The missing "window" is cosmetic. The missing focused control isn't. Someone alt-tabbing into the app gets no idea where they are until they press Tab or an arrow key, and if they land somewhere they didn't expect there's nothing telling them so.
The cause looks like the window itself rather than anything in the tree. On Paper the app was UWP, so the top-level window was an ApplicationFrameWindow owned by ApplicationFrameHost, which NVDA has specific handling for. On Fabric it's a Microsoft.UI.Windowing.Window in the app's own process. Everything else I compared is the same across all three:
| Legacy Gallery | Gallery | My app | |
|---|---|---|---|
| Win32 class | ApplicationFrameWindow |
Microsoft.UI.Windowing.Window |
Microsoft.UI.Windowing.Window |
| Host process | ApplicationFrameHost | app | app |
| GWL_STYLE | 0x15CF0000 |
0x15CF0000 |
|
| GWL_EXSTYLE | 0x00000100 |
0x00000100 |
|
| UIA ControlType | Window | Window | Window |
| LocalizedControlType | window | window | window |
| FrameworkId | Win32 | Win32 | Win32 |
So the UIA properties on the window are already what you'd want. It's the activation event that isn't producing the usual announcement.
Worth saying that everything inside the app is fine. Tabbing to a button in my app gives:
Fetch button Downloads new commits without changing your working tree F
which is accessibilityLabel, accessibilityHint and accessibilityAccessKey all coming through correctly. Arrow key navigation in lists reads correctly too. It's specifically the moment the window is activated.
I don't know whether this is fixable in RNW or whether it needs something from the windowing layer underneath. If there's a workaround at the app level I'd be glad to hear it. Re-asserting focus on WM_ACTIVATE to force a UIA focus change is the only thing I can think of, and that needs a native activation event surfaced to JS, since AppState only reports deactivation and only behind MapWindowDeactivatedToAppStateInactive.
Steps To Reproduce
- Install both React Native Gallery and React Native Gallery (Legacy) from the Microsoft Store.
- Start NVDA and turn on Speech Viewer (NVDA menu, Tools, Speech Viewer).
- Alt-tab into the legacy app. Speech Viewer shows the title, then
<title> window, then the focused control. - Alt-tab into the current app. Speech Viewer shows the title and nothing else.
Same result with a new app from npx react-native init-windows --template cpp-app.
Expected Results
Activating a Fabric window announces the window and the focused control, the way Paper did and the way other Windows apps do.
CLI version
20.1.0
Environment
System:
OS: Windows 11 10.0.26300 (26H2, UBR 9445)
CPU: (16) x64 AMD Ryzen 7 5700G
Memory: 15.70 GB / 31.29 GB
Binaries:
Node: 25.9.0
Yarn: 1.22.22
npm: 11.19.1
SDKs:
Windows SDK: 10.0.26100.0
IDEs:
Visual Studio 2026 (18.9.3)
npmPackages:
"@react-native-community/cli": 20.1.0
react: 19.2.3
react-native: 0.84.1
react-native-windows: 0.84.0
NVDA 2026.2.
Community Modules
None. Reproduces on a bare cpp-app template project and on both Store builds of React Native Gallery.
Target Platform Version
Windows 11 10.0.26300
Target Device(s)
Desktop
Visual Studio Version
Visual Studio 2026
Build Configuration
Debug
Snack, code example, screenshot, or link to a repository
Reproduces on React Native Gallery from the Store, no repo needed.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce with the bare cpp-app template, NVDA Speech Viewer, and the alt-tab steps comparing Fabric with Paper. Start by tracing the activation path around WM_ACTIVATE, AppState, and MapWindowDeactivatedToAppStateInactive; the fix is done when activating a Fabric window announces the window and focused control like Paper.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp, react-native
- Domain
- accessibility, desktop, operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100