Search code examples
wpfwindowsscreen-readersnvda

How to enable Screenreader "Browse Mode" in a custom Application?


Screen readers like NVDA implement two modes of operation: Browse Mode and Focus Mode.

  • Browse Mode is for reading a website/document/application. The screen reader will read all visible contents.
  • To interact with the website/document/application, Focus Mode offers some advantages: only the interactive content parts are read. In a website, this would mean that links, buttons, forms and navigation are read, but normal text is not read.

In NVDA, you can usually switch between Browse and Focus mode with Insert+Space, which is then confirmed by a sound. This works in most applications: Browsers, Windows Explorer, Skype, VS Code.

However, in my own WPF application (which e.g. has accessibility labels), when I press Insert+Space, nothing happens. NVDA seems to always be in Focus Mode, and there is no Browse Mode.

Intuitively this makes sense, because for Browse Mode, the screenreader needs to "know" what elements it should read, and in what order.

I have no clue where to begin implementing it. Is this a common WPF problem? Is it a problem of NVDA, which somehow needs to know that the application is capable of Browse Mode?


Solution

  • Seems this is the way NVDA detects accessibility of an application:

    Normally, NVDA uses the IAccessible2 API to get accessibility information from Chrome. With this embedded version of Chrome, NVDA seems to be unable to query the IAccessible2 interfaces and falls back to plain IAccessible/MSAA. I've seen this in embeded Chrome versions in Qt as well. Pretty sure it is a problem in the embedded version of Chrome.

    Source: https://github.com/nvaccess/nvda/issues/13493