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:
My app on RNW 0.84.0:
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.
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, current Fabric build:
My app on RNW 0.84.0:
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
ApplicationFrameWindowowned by ApplicationFrameHost, which NVDA has specific handling for. On Fabric it's aMicrosoft.UI.Windowing.Windowin the app's own process. Everything else I compared is the same across all three:ApplicationFrameWindowMicrosoft.UI.Windowing.WindowMicrosoft.UI.Windowing.Window0x15CF00000x15CF00000x000001000x00000100So 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:
which is
accessibilityLabel,accessibilityHintandaccessibilityAccessKeyall 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_ACTIVATEto force a UIA focus change is the only thing I can think of, and that needs a native activation event surfaced to JS, sinceAppStateonly reports deactivation and only behindMapWindowDeactivatedToAppStateInactive.Steps To Reproduce
<title> window, then the focused control.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
NVDA 2026.2.
Community Modules
None. Reproduces on a bare
cpp-apptemplate 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.