Skip to content

Fabric: activating the window doesn't announce the window or the focused control to a screen reader #16435

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

  1. Install both React Native Gallery and React Native Gallery (Legacy) from the Microsoft Store.
  2. Start NVDA and turn on Speech Viewer (NVDA menu, Tools, Speech Viewer).
  3. Alt-tab into the legacy app. Speech Viewer shows the title, then <title> window, then the focused control.
  4. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Needs: Triage 🔍New issue that needs to be reviewed by the issue management team (label applied by bot)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions