WhatsAppUnified (Объединенный WhatsApp)
Автор:- Исходный код дополнения: Посетить Web-сайт whatsAppUnified
Краткое описание
Дополнение WhatsAppUnified предназначено для улучшения доступности мессенджера WhatsApp в экранном диктофоне NVDA.
Оно объединяет функциональность двух популярных дополнений: whatsAppNG и whatsAppEnhancer.
Дополнение работает как с настольным приложением WhatsApp Desktop, так и с веб-версией WhatsApp Web.
Вы можете выбрать область его действия в настройках: только десктопное приложение, только веб-версия или оба варианта одновременно.
Основные возможности включают быструю навигацию по интерфейсу с помощью горячих клавиш.
Вы можете легко переключаться между списком чатов, областью сообщений и полем ввода текста.
Дополнение позволяет воспроизводить голосовые и видео сообщения, а также открывать контекстное меню сообщений.
Для удобства работы реализована поддержка копирования сообщений, их полного прочтения и быстрых реакций.
В десктопной версии доступно удобное меню для управления звонками.
Дополнение включает мощные фильтры для очистки интерфейса от лишней информации.
Вы можете автоматически убирать номера телефонов из текста сообщений и списка чатов.
Также доступна функция удаления подсказок типа «Для дополнительных возможностей» и слова «Возможно» перед именами контактов.
Для стабильной работы предусмотрена функция автоматического удержания режима фокуса в нужных областях приложения.
В случае необходимости вы можете полностью отключить эту функцию через настройки.
Все особенности описаны в справочном руководстве.
Основная информация
| Название | Версия | Совместимость с API NVDA | Последняя протестированная версия NVDA | Минимальная версия NVDA | Дата загрузки в каталог | Размер | Лицензия |
|---|---|---|---|---|---|---|---|
| whatsAppUnified | 1.2.20 | 2025.1 | 2025.3 | 2024.1 | 09-09-2026 21:41:25 | 67 Кб. | GPL v2 |
Журнал изменений
Подробнее
История изменений в справочном руководстве.
Скачать
WhatsAppUnified-V.1.2.20.nvda-addon
⬇ Перейти к истории версий 🔝 Назад к оглавлениюИнформация о локализации на русский язык
- Локализация от: Разработчик или другой переводчик
- Перевод: Да
- Перевод интерфейса: Да
- Перевод справки: Да
Разделы
🔝 Назад к оглавлениюСправка
Подробнее
Дополнение WhatsApp Unified (Объединенный WhatsApp)
Расположение
C:\Users\leodb\AppData\Roaming\nvda\addons\whatsAppUnified\
Распространяемый файл (для установки на другом ПК): Desktop\whatsAppUnified-1.0.0.nvda-addon
Структура файлов
whatsAppUnified/
├── manifest.ini — метаданные дополнения
├── appModules/
│ ├── whatsapp_root.py — основная логика (Десктоп)
│ └── wa_ui.py — доступное текстовое окно
└── globalPlugins/
└── wa_global.py — регистрация исполняемого файла + панель настроек
Что делает дополнение
Объединение дополнений whatsAppNG (Nuno Costa) и whatsAppEnhancer (mrido1) с исправлениями и дополнительными защитами.
Работает для WhatsApp Desktop (WebView2/Electron) и имеет опцию области действия в настройках.
Состояние паритета Web/Desktop (в разработке с 12/08/2026)
У Десктоп-версии всегда было гораздо больше возможностей, чем у Web-версии (Web изначально появился только с частью, связанной с режимом фокуса/навигации). Список того, что предстоит перенести в Web, по одному пункту за раз, с тестированием совместно с Лео после каждого шага — без использования фиксированного имени класса в качестве основного метода (см. changelog 1.2.11 о том, почему это рискованно без инспекции в реальном времени).
- [x] NVDA+Shift+I (инспектировать элемент) — 1.2.11
- [ ] Alt+1 / Alt+2 / Alt+D (перейти к списку чатов / сообщений / полю ввода)
- [ ] Enter (воспроизвести голосовое/видео сообщение)
- [x] Контекстное меню сообщения — 1.2.16, переделано с использованием
chooseNVDAObjectOverlayClasses(классMessageMenuItemNav, привязанный только к объектам MENUITEM, подтверждённым как WhatsApp Web) после того, как глобальная попытка в версии 1.2.12 нарушила навигацию на всех веб-страницах и была отменена в версиях 1.2.13/1.2.14. - [ ] Ctrl+C (копировать сообщение)
- [ ] Ctrl+R (прочитать полное сообщение / развернуть "читать далее")
- [ ] Alt+Enter (открыть сообщение в режиме навигации)
- [ ] Ctrl+Shift+Enter (реагировать на сообщение)
- [ ] Alt+C (открыть сообщение в текстовом окне)
- [ ] Shift+Alt+C (меню вызова)
- [ ] NVDA+Стрелки / NVDA+Ctrl+Стрелки / NVDA+Вверх/Вниз (обзор текста по символам/словам/строкам)
- [ ] Ctrl+Shift+E / NVDA+Shift+H (быстрое переключение фильтров)
- [ ] Защищённая стрелка влево/вправо в списке чатов
- [ ] Окончательно включить автоматические фильтры (телефон/"Возможно"/подсказки/дубликаты) в Web, или удалить соответствующие опции из экрана настроек, если перенос не планируется (сейчас они отображаются, но ничего не делают в Web — известная ошибка, сообщено 12/08)
- [ ] Десктоп: добавить Escape ту же "умность", что и в Web (отмена ответа/редактирования в поле ввода вместо простого выхода из режима фокуса) — единственный оставшийся пункт в обратную сторону
Настройки (NVDA → Параметры → WhatsApp Unificado)
| Опция | Значение по умолчанию | Описание |
|---|---|---|
| Применять для | Desktop | Desktop / WhatsApp Web / Оба |
| Фильтровать номера телефонов в сообщениях | Да | Удаляет номера типа +55 11... из сообщений |
| Фильтровать номера в списке чатов | Нет | То же самое для левой панели |
| Отключать подсказки по использованию | Да | Удаляет текст "Для дополнительных возможностей..." |
| Убирать "Возможно" перед именами | Да | Очищает "Возможно Жуан" → "Жуан" |
| Автоматически удерживать режим фокуса | Да | Принудительно устанавливает passThrough=True при получении фокуса |
Горячие клавиши
Навигация (унаследовано от whatsAppNG)
| Клавиша | Действие |
|---|---|
| Alt+1 | Перейти к списку чатов |
| Alt+2 | Перейти к списку сообщений |
| Alt+D | Перейти к полю ввода |
| Enter | Воспроизвести голосовое или видео сообщение |
| Shift+Enter | Контекстное меню сообщения |
| Ctrl+C | Копировать текущее сообщение |
| Ctrl+R | Прочитать/развернуть обрезанное сообщение |
| Alt+Enter | Открыть сообщение в режиме навигации |
| Ctrl+Shift+Enter | Реагировать на сообщение |
| NVDA+Shift+H | Переключить фильтр подсказок по использованию |
Дополнительные (унаследовано от whatsAppEnhancer)
| Клавиша | Действие |
|---|---|
| Alt+C | Открыть сообщение в текстовом окне |
| Shift+Alt+C | Открыть меню вызова |
| NVDA+Стрелки | Обзор последнего произнесённого текста (по символам/словам/строкам) |
| Ctrl+Shift+E | Переключить фильтр номеров телефонов |
| NVDA+Пробел | Переключить режим навигации |
| NVDA+Shift+I | Инспектировать элемент (отладка) |
Защита навигации
- Стрелка влево в списке чатов → перенаправляет вверх (предотвращает попадание во встроенные кнопки)
- Стрелка вправо в списке чатов → перенаправляет вниз
Известные проблемы / Ожидающие решения
Случайные звонки при использовании стрелок в истории
При навигации с помощью стрелок влево/вправо внутри сообщений (реакции, аудио, файлы, ссылки) фокус может перескочить на кнопки вызова в заголовке чата. В некоторых случаях WhatsApp Desktop инициирует звонок при получении фокуса этой кнопкой (поведение WebView2).
Статус: Частично смягчено (список чатов защищён). Требуется дальнейшее исследование: использовать NVDA+Shift+I с фокусом на проблемной кнопке, чтобы определить роль, класс CSS и точное имя, а затем добавить точную защиту.
Приоритет звука (ducking)
Установлен параметр audioDuckingMode = 1 в nvda.ini. Приглушает другие звуки, когда NVDA говорит.
Ослабление звука во время звонков
Применён реестр Windows UserDuckingPreference=3 — Windows больше не приглушает NVDA во время VoIP-звонков.
Журнал изменений
1.2.19 (2026-08-14) — Web: отменена версия 1.2.18, исправлено в корне
Лео указал: собственная навигация с помощью setFocus() между соседними кнопками (1.2.18) ничего не решила — "всё то же самое". Попросил проанализировать, что на самом деле делает Десктоп: ничего. В Десктопе нет никакого кода для перемещения между реакциями/ответами/пересылками/воспроизведением аудио/ссылками внутри сообщения — он просто пропускает нажатие стрелки к странице (gesture.send()), если включён режим фокуса. Настоящую навигацию выполняет сам JavaScript WhatsApp.
Реальная причина: усиление режима фокуса в Web охватывало только СТРОКУ сообщения (роль SECTION/UNKNOWN), но не КНОПКИ внутри неё — поэтому при попадании на конкретную кнопку (фото отправителя, цитируемое сообщение, реакция...) режим фокуса мог теряться по пути (та же ошибка NVDA, что влияет на меню), а попытка воссоздать навигацию вручную (1.2.18) не точно воспроизводила порядок/реальную структуру кнопок.
Исправлено по-настоящему: удалён класс MessageInlineButtonNav и вся ручная навигация. Вместо этого усиление режима фокуса (event_gainFocus) теперь также охватывает любую BUTTON с предком focusable-list-item (та же конвенция, которая уже идентифицирует "это строка сообщения") — то есть режим фокуса остаётся включённым всё время внутри сообщения, как это уже делает Десктоп по умолчанию, и позволяет WhatsApp самостоятельно управлять навигацией. Меньше кода, ближе к тому, что уже работает с другой стороны.
1.2.18 (2026-08-14) — Web: кнопки внутри сообщения получили безопасную навигацию
Диагностировано с Лео через инспектор: стрелка вправо на сообщении вела к кнопке имени/фото отправителя ("Возможно Веллингтон"), следующая стрелка вела к "Цитируемому сообщению" — и после этого дальнейшие стрелки начинали перемещаться по СИМВОЛАМ вместо переключения между кнопками. Та же ошибка NVDA, что влияет на меню (теряется режим фокуса по пути), но на этот раз с левой/правой стрелкой, внутри встроенных кнопок сообщения (фото/имя отправителя, цитируемое сообщение, реакция, ответ, пересылка, "...").
Исправлено с использованием той же безопасной техники: новый класс MessageInlineButtonNav через chooseNVDAObjectOverlayClasses — применяется только к BUTTON, которая (a) подтверждена как принадлежащая WhatsApp Web (проверка URL) и (b) имеет предка с классом focusable-list-item (та же конвенция, которую Десктоп уже использует для идентификации "это строка сообщения"). Стрелки влево/вправо теперь перемещаются по соседним кнопкам с реальным фокусом, не полагаясь на проблемное поведение NVDA. Никакое новое сочетание клавиш не является глобальным — оно существует только для этих конкретных кнопок и не влияет на другие кнопки на других сайтах.
1.2.17 (2026-08-13) — Web: исправлена регрессия проверки URL в списке
Обнаружено Лео: после версии 1.2.13 (замена заголовка окна на реальный URL, более точный), список чатов/сообщений потерял усиление режима фокуса именно там — всё остальное (контекстное меню, поле ввода) продолжало работать. Причина: _check_whatsapp_web возвращала False сразу, когда URL документа не совпадал с "web.whatsapp.com", не используя заголовок в качестве резерва — а некоторые элементы (похоже, в основном в списке) используют UIA вместо IA2, где этот идентификатор документа иногда не является реальным URL и не совпадает. Исправлено: URL теперь учитывается только как ПОЛОЖИТЕЛЬНЫЙ ответ (совпадение = точно WhatsApp Web); если не совпадает, используется заголовок как резерв — как было до версии 1.2.12, без потери дополнительной точности URL там, где он работает.
1.2.16 (2026-08-13) — Web: контекстное меню сообщения, на этот раз безопасно
Подтверждено исследованием: с декабря 2025 года WhatsApp Desktop (Windows) загружает буквально web.whatsapp.com внутри WebView2 — та же страница, тот же пакет, те же CSS-классы на обеих сторонах (не просто "похоже"). Ярлык Лео на рабочем столе ("WhatsApp Web.lnk") — это установленное приложение Chrome (chrome_proxy.exe, --app-id=hnpfjngllnobngcgfapefoaidbinmjnm) — работает в изолированном окне, без смешивания с обычными вкладками, что подтверждает точность проверки по URL, уже используемой с версии 1.2.13.
Контекстное меню в Web, переделано с нуля с использованием безопасного метода: класс MessageMenuItemNav, зарегистрированный через chooseNVDAObjectOverlayClasses — применяется только к объектам с ролью MENUITEM И которые проходят проверку URL (пересчитывается в реальном времени, без кэширования, чтобы избежать гонки с циклом событий NVDA). Стрелки вверх/вниз перемещаются по элементам (Ответить, Переслать, Удалить и т.д.) с реальным фокусом; Enter активирует. В отличие от попытки в версии 1.2.12: здесь НИЧТО не регистрируется как глобальное сочетание клавиш — жесты существуют только пока сфокусирован именно элемент этого конкретного меню, поэтому они не могут "просочиться" на другой сайт или повторить инциденты версий 1.2.12/1.2.14.
Использование: как и всегда — Enter на кнопке "..." открывает меню (попадает на первый пункт, сейчас это реакция); ОДНА стрелка вниз работает нативно (сама ошибка NVDA #7836 гарантирует это) и переходит на первый текстовый пункт; с этого момента собственная навигация вступает в силу и больше никуда не уводит.
1.2.15 (2026-08-13) — Десктоп: меню вызова получило настоящую навигацию
Исследование на GitHub (по просьбе Лео): подтверждено снова, на этот раз через API поиска GitHub (репозитории + код), что не существует ни одного дополнения NVDA, посвящённого WhatsApp Web (браузер), нигде — каждый найденный проект "WhatsApp + NVDA" (включая новый, индонезийский, taklukkan_WhatsApp) нацелен на приложение Десктоп, несмотря на иногда запутанные описания, упоминающие "web". Ничего нового для заимствования.
Десктоп, исправлено: перенесён из оригинального whatsAppEnhancer механизм виртуальной навигации по меню (CallMenuDialog/HeaderMenuDialog, через chooseNVDAObjectOverlayClasses), который отсутствовал в исходном объединении Лео. Раньше Shift+Alt+C только открывал меню вызова, но не давал возможности перемещаться внутри него (та же ошибка NVDA #7836, которая затронула Web). Теперь внутри этого конкретного меню стрелки вверх/вниз перемещаются по пунктам, а Ctrl+Enter активирует — привязано только к объекту меню (никогда ко всей клавиатуре), та безопасная техника, которую следовало использовать с самого начала и для контекстного меню Web (остаётся в ожидании, когда Лео захочет возобновить эту работу, теперь имея правильный шаблон).
1.2.14 (2026-08-13) — СРОЧНОЕ ИСПРАВЛЕНИЕ #2, та же корневая ошибка с Escape
Обнаружено Лео: после отключения дополнения (потребовалось, чтобы закрыть окно редактирования в Google Forms с помощью Escape), стало ясно, что script_escape в WhatsApp Web имел ТУ ЖЕ проблему, что и 1.2.13 — зарегистрирован как ГЛОБАЛЬНОЕ сочетание (kb:escape, без клавиши NVDA). Даже с проверкой "это не WhatsApp Web" и отправкой gesture.send() обратно, это НЕ эквивалентно тому, чтобы никогда не перехватывать: gesture.send() отправляет сырое нажатие клавиши в систему, но пропускает внутренний механизм NVDA выхода из режима фокуса (disablePassThrough) — именно этого другие сайты (включая Google Forms) ожидают при нажатии Escape в поле. Полностью удалён script_escape из WhatsApp Web.
Правило отныне, действительное для любых будущих сочетаний в этом дополнении: безопасно регистрировать ТОЛЬКО ГЛОБАЛЬНЫЕ сочетания (GlobalPlugin), когда используется клавиша NVDA (NVDA+Пробел, NVDA+Shift+I) — это нажатие никогда не доходит до Windows/страницы в любом случае, его видит только NVDA, поэтому нет нативного поведения, которому можно помешать. Обычная клавиша без модификаторов (Enter, стрелки, Escape, Tab) — даже с проверкой "это не WhatsApp" и отправкой gesture.send() обратно — НЕ БЕЗОПАСНА как глобальное сочетание, потому что gesture.send() не заменяет нативную обработку NVDA для этих клавиш НИГДЕ в системе. Любое подобное решение в будущем должно быть привязано к конкретному объекту (chooseNVDAObjectOverlayClasses, как уже делает Десктоп), либо оставаться за пределами области действия Web.
1.2.13 (2026-08-13) — СРОЧНОЕ ИСПРАВЛЕНИЕ, частичный откат версии 1.2.12
Серьёзная ошибка, обнаруженная Лео: после версии 1.2.12 навигация с помощью стрелок перестала работать на ЛЮБОЙ обычной веб-странице, не только в WhatsApp. Причина: собственная навигация меню контекста зарегистрировала стрелки-вверх/вниз и Enter как ГЛОБАЛЬНОЕ сочетание (GlobalPlugin) — это перехватывает эти клавиши во всей системе Windows всегда, до всего остального. Вне WhatsApp Web код пытался "пропустить" их с помощью gesture.send(), но это отправляет сырое нажатие клавиши в систему — что НЕ является тем же самым, что способ NVDA перемещать виртуальный курсор и читать строки в режиме навигации на обычной странице. Результат: простое существование глобального сочетания заставляло NVDA перестать выполнять собственную навигацию по странице везде.
Отменено в этой версии: вся собственная навигация контекстного меню (вспомогательные функции _is_context_menu_button/_climb/_collect_menu_items/_open_context_menu и скрипты script_enterWeb/script_menuNextWeb/script_menuPrevWeb) — WhatsApp Web снова лишился этой функции, но обычная навигация на любых страницах вернулась в норму.
Сохранено и даже улучшено: определение "это WhatsApp Web" (_check_whatsapp_web) теперь проверяет реальный URL вкладки (treeInterceptor.documentConstantIdentifier) вместо только заголовка окна — более точно, устраняет риск (гораздо более умеренный) активации на неверной странице из-за совпадения заголовка, о чём Лео спрашивал до появления этой ошибки.
Урок на будущее: правильный способ воссоздания контекстного меню (без повторения этой ошибки) — использовать chooseNVDAObjectOverlayClasses — тот же механизм, который whatsAppEnhancer использует в Десктопе для меню вызова (CallMenuDialog/HeaderMenuDialog в whatsapp_root.py оттуда). Это привязывает пользовательское сочетание только к конкретному объекту элемента меню, никогда ко всей клавиатуре Windows — нулевой риск "просачивания" на другие страницы. Ожидает, когда Лео захочет возобновить работу.
1.2.12 (2026-08-13)
Контекстное меню сообщения в WhatsApp Web, собственная навигация. Диагностировано с Лео в сеансе в реальном времени с использованием инспектора из версии 1.2.11: ошибка "попадание на реакцию / спуск к чату ниже / переход на панель контактов" при попытке использовать меню "..." — это документированная ошибка NVDA (issue #7836) с кнопками aria-haspopup — первая стрелка работает внутри меню, последующие "соскальзывают" в режим навигации без предупреждения и начинают перемещать курсор NVDA по всей странице вместо перемещения по меню. Исправлено: Enter на кнопке "..." теперь открывает меню, и дополнение само собирает элементы с ролью "пункт меню" (Ответить, Переслать, Удалить и т.д. — без смайликов реакций, у которых своя кнопка, подтверждено с Лео) в список и начинает самостоятельно управлять стрелками вверх/вниз/Enter/Escape, пока этот список существует, больше никогда не затрагивая проблемный путь NVDA. Отпечаток кнопки "..." подтверждён реальной инспекцией (не предположение): роль кнопка + состояние свёрнуто + как минимум 3 из 5 известных классов (те же, что и в Десктопе, действительны и в Web).
1.2.11 (2026-08-12)
Начало паритета с Web (шаг 1 из многих — см. раздел "Состояние паритета Web/Desktop"): добавлено NVDA+Shift+I (инспектировать элемент) в WhatsApp Web, в том же формате, что и в Десктопе, с дополнительным включением состояний. Нулевой риск (только чтение и озвучивание, ничего не меняет) — служит инструментом диагностики для следующих шагов, поскольку невозможно подтвердить извне, действительны ли имена классов Десктопа (fd365im1, xjb2p0i и т.д.) для Web без инспекции в реальном времени (сборка JS на экране входа не включает код чата, он загружается только после входа). Следующие шаги будут отдавать предпочтение роли/состоянию элемента (более стабильны между обеими сторонами) перед фиксированным именем класса и использовать этот инспектор для подтверждения перед предположениями.
1.2.10 (2026-08-12)
Расширен критерий из версии 1.2.9 также на внутреннюю область чата. Перемещение МЕЖДУ сообщениями (стрелки вверх/вниз в списке сообщений) обрабатывается тем же механизмом JavaScript в WhatsApp, что и список чатов — требуется постоянно включённый режим фокуса, иначе стрелки превращаются в навигацию NVDA вместо перемещения между сообщениями. Теперь критерий основан на РОЛИ элемента, получающего фокус, а не на "находится внутри TABLE": любой элемент списка (SECTION/TABLECELL/неизвестная роль — охватывает строку списка чатов И строку сообщения) включает режим фокуса при каждом изменении фокуса; всё остальное (КНОПКА реакции, воспроизведения, загрузки, поле внутри подменю) принудительно включается только при входе в WhatsApp из другой программы — сохраняя свободу Escape/NVDA+Пробел/Ctrl+стрелки для исследования внутри конкретного сообщения.
1.2.9 (2026-08-12)
Исправлена регрессия версии 1.2.8: в списке чатов (Web и, профилактически, Десктоп) стрелки перестали правильно перемещаться между контактами. Причина: версия 1.2.8 перестала принудительно включать режим фокуса при каждом внутреннем изменении фокуса (чтобы не конфликтовать с Escape/NVDA+Пробел в списке сообщений и подменю) — но список чатов отличается: там стрелки обрабатываются самим JavaScript WhatsApp (выбор элемента), поэтому режим фокуса ДОЛЖЕН быть всегда включён, иначе стрелки становятся навигацией NVDA вместо того, чтобы попадать на страницу "как есть". Решение: две скорости, в зависимости от того, где находится фокус. В списке чатов (внутри TABLE — тот же критерий, который уже использовался для других проверок в дополнении), режим фокуса принудительно включается при каждом изменении фокуса, как и раньше. В остальной части страницы (сообщения, подменю, поле ввода) он включается только при входе в WhatsApp из другой программы, сохраняя исправление версии 1.2.8 для Ctrl+стрелок и "Enter после Escape".
1.2.8 (2026-08-11)
Перепроектировано (окончательное исправление): версии 1.2.6/1.2.7 всё ещё оставляли два симптома той же корневой проблемы: в Десктопе навигация по словам с помощью Ctrl+стрелок перестала работать (работала в Web); а для открытия подменю сообщения (реакция, воспроизведение аудио и т.д.) всё ещё требовалось нажать Enter, а затем Escape, на обеих сторонах.
Причина: даже после версии 1.2.6 дополнение продолжало реагировать на ЛЮБОЕ изменение режима NVDA (событие post_browseModeStateChange) и возвращать режим фокуса — но этот возврат пропускался только в том случае, если использовалась МОЯ СОБСТВЕННАЯ клавиша NVDA+Пробел. Если пользователь выходил из режима фокуса другим способом — включая нативный Escape NVDA (disablePassThrough, стандартный механизм самого NVDA, подтверждён в его исходном коде) — дополнение возвращало режим обратно почти мгновенно, без предупреждения. Это объясняет "Enter после Escape" (Escape успевал сработать на мгновение и сразу отменялся) и заблокированную навигацию Ctrl+стрелками (работает только в реальном режиме навигации).
Изменение архитектуры: я перестал реагировать на изменения режима после того, как они произошли. Теперь режим фокуса принудительно включается только в двух осознанных моментах: (1) при входе в WhatsApp из другой программы (event_foreground в Десктопе / переход фокуса на WhatsApp Web — никогда при каждом внутреннем изменении фокуса), и (2) при переходе в поле ввода (Alt+D). В остальное время NVDA может свободно перемещаться своим собственным способом — Escape выходит из режима фокуса нормально, NVDA+Пробел переключает, и ВЫБОР СОХРАНЯЕТСЯ, а Ctrl+стрелки начинают перемещаться по словам внутри сообщения в режиме навигации, как это уже работало в Web. Также настроено: в WhatsApp Web Escape перенаправляется в браузер только когда фокус находится в поле ввода (отмена ответа/редактирования); в любом другом месте он выполняет нативный Escape NVDA (выход из режима фокуса) — раньше он всегда отправлялся в браузер, даже при навигации по сообщениям, что также способствовало той же проблеме.
1.2.7 (2026-08-11)
Углублённое исследование (исходные дополнения): я сравнил код с двумя исходными дополнениями прямо на GitHub — whatsAppNG (nunotfc) и whatsAppEnhancer (starkrush123/mrido1). Находка 1: в whatsAppNG существует точно такой же "сторожевой" механизм режима фокуса, который вызывал ошибку в версии 1.2.6, и у пользователя нет возможности его обойти — то есть ошибка пришла из более ранних версий, а не была введена при объединении. Находка 2: whatsAppEnhancer уже официально решил эту проблему с помощью опции "disable_browse_mode_lock" в настройках, которая при включении делегирует управление НАТИВНОЙ команде NVDA (globalCommands.commands.script_toggleVirtualBufferPassThrough) вместо простого ручного переключения атрибута passThrough — это важно, потому что нативная команда синхронизирует курсор обзора и правильно объявляет режим, чего не делает прямая установка атрибута.
Изменения в этой версии:
script_toggleBrowseMode/script_toggleBrowseModeWeb(NVDA+Пробел) теперь вызывают нативную команду NVDA, когда она доступна, с откатом к ручному переключению, только если она не существует.- Новая расширенная опция в настройках: "Полностью отключить блокировку режима фокуса" (отключена по умолчанию) — полный аварийный выход, как в
whatsAppEnhancer, для редкого случая, когда динамического флага из версии 1.2.6 недостаточно. - Фоновое понимание причины поломки: WhatsApp Desktop сменил движок (нативный UWP → WebView2/Electron) в конце 2025 года, и внутри стал вести себя как веб-страница. У NVDA есть два режима для веб-страниц: режим навигации (виртуальный курсор — стрелки перемещаются по ВСЕМ элементам "сплющенного" дерева доступности, включая вложенные кнопки, такие как кнопка загрузки файла, даже если Microsoft не сделала эту кнопку доступной для Tab) и режим фокуса (клавиши направляются непосредственно элементу управления, хорошо работает только с полями форм и нативными элементами управления Windows). Автоматический режим фокуса этого дополнения полезен для поля ввода и плавного чтения сообщений, но любой вложенный элемент, существующий только в "сплющенном" дереве страницы (не является нативной точкой остановки Tab), доступен только в режиме навигации — отсюда необходимость позволить пользователю намеренно переключаться в режим навигации, чтобы дополнение не отменяло это автоматически.
1.2.6 (2026-08-11)
Исправлено: автоматический режим фокуса отменял собственное переключение NVDA+Пробел пользователя. Дополнение принудительно устанавливало passThrough=True при каждом событии фокуса и изменении режима NVDA, даже если пользователь только что включил режим навигации — на практике NVDA+Пробел казался неработающим. Это мешало достичь вложенных элементов внутри сообщения (например, кнопки загрузки файла/документа), которые недоступны в чистом режиме фокуса, только в режиме навигации. Исправлено в whatsapp_root.py (Десктоп) и wa_global.py (Web) с помощью флага _userWantsBrowseMode: автоматический режим фокуса теперь уважает ручной выбор пользователя, пока он не переключится обратно (NVDA+Пробел снова) или не перейдёт в поле ввода (Alt+D, который намеренно принудительно включает режим фокуса). WhatsApp Web получил собственный скрипт NVDA+Пробел (раньше полагался только на стандартный NVDA, который отменялся "сторожевым" механизмом).
Как версионировать / переименовывать
Внутреннее имя дополнения находится в manifest.ini (поле name) и в wa_global.py (регистрация исполняемого файла). Для переименования:
manifest.ini→ изменитьname,summaryиversionwa_global.py→ изменитьscriptCategoryи заголовок панели- Перепаковать: выполнить скрипт ниже в терминале Windows
- Имя установленной папки в
nvda/addons/— переименовать папку также
import zipfile, os
output = r'C:\Users\leodb\Desktop\whatsAppAcessibilidade-1.1.0.nvda-addon'
base = r'C:\Users\leodb\AppData\Roaming\nvda\addons\whatsAppUnified'
with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as z:
for root, dirs, files in os.walk(base):
for file in files:
filepath = os.path.join(root, file)
arcname = os.path.relpath(filepath, base)
z.write(filepath, arcname)
История версий
История версий
| Версия файла | Тестируемая версия NVDA | Минимальная версия NVDA | Размер файла (КБ) | Ссылка на загрузку |
|---|---|---|---|---|
| 1.2.5 | 2025.3 | 2024.1 | 13 | WhatsAppUnified-V.1.2.5.nvda-addon |
| 1.2.20 | 2025.3 | 2024.1 | 67 | WhatsAppUnified-V.1.2.20.nvda-addon |