Gestor de notificaciones para NVDA

Versión 0.3.0-dev, en español e inglés. GPL 2 o posterior.

Historial, filtros, reglas personales de sonido WAV, favoritos, lectura posterior, exportación y No molestar con horario.

Versión de desarrollo: motor probado automáticamente, adaptador con APIs simuladas y diálogos con wxPython real. La API nativa se ha probado realmente desde Python en este equipo; está pendiente probar el paquete dentro de NVDA y la lectura de los controles. El intervalo 2024.1–2026.1 del manifiesto es provisional; lastTestedNVDAVersion no acredita aquí una prueba manual en esas versiones. El código NVDA adjunto consultado se identifica como 2027.1dev.

Modo fácil y accesibilidad

La ventana se abre por defecto en modo fácil: búsqueda, lista, Actualizar, Detalles, Leer y Copiar. Enter abre el texto completo en un cuadro de lectura; Leer lo anuncia con NVDA. F5 incorpora las notificaciones nuevas. La lista no se actualiza sola mientras está leyendo y conserva la notificación seleccionada al actualizar, siempre que siga presente.

Modo avanzado muestra los filtros, favoritos, exportación, reglas, ajustes y API Windows. El botón Modo fácil permite volver. La elección se guarda; los filtros avanzados se restablecen al entrar en modo fácil para no ocultar avisos. Cambiar de modo no borra notificaciones ni reglas.

El botón Accesibilidad…, disponible en ambos modos, permite elegir qué campos acompañan al texto al recorrer filas: fecha, aplicación, clase y estado. El texto siempre se incluye. Para explorar columnas use izquierda/derecha o Control+1 a Control+5 (fecha, aplicación, clase, estado, texto). Puede elegir si se anuncia el número de fila, el encabezado y el contenido. Si desactiva las tres opciones se lee el contenido. Las columnas de clase y estado no se muestran visualmente en modo fácil, pero siguen disponibles mediante estos atajos.

La lista conserva el texto completo sin el límite de 511 caracteres de la lectura nativa de ListView. La adaptación de NVDA se restringe a esta ventana y proporciona el nombre de fila al procesamiento habitual de voz y braille; no añade una segunda locución al seleccionar filas. Las preferencias de voz y braille generales siguen siendo las de NVDA. La lectura integrada requiere validación con NVDA instalado.

Instalación y acceso

  1. Abra notificationManager-0.3.0-dev.nvda-addon con NVDA, instale y reinicie cuando se lo solicite.
  2. Abra NVDA → Herramientas → Gestor de notificaciones o pulse NVDA+Alt+N.
  3. Genere una notificación nueva y pulse Actualizar en Historial.
  4. Seleccione con las flechas; Enter abre los detalles. Tab y Mayús+Tab recorren controles.

Atajos: NVDA+Alt+N abre el gestor; NVDA+Alt+L lee la última entrada conservada; NVDA+Alt+M alterna No molestar manual. Se reasignan en Preferencias → Gestos de entrada → Gestor de notificaciones. Allí existe también Pausar o reanudar la captura, sin atajo inicial. Resuelva posibles conflictos con otros complementos cambiando la combinación. El horario puede seguir activando No molestar aunque desactive el modo manual.

Cobertura real

Conserva, cuando existen: fecha, texto, proceso, PID, clase, evento NVDA, clase de ventana, rol, clase de objeto, tipo y procesamiento UIA, actividad, prioridad de región viva, regla aplicada y estado de lectura/favorito.

El proceso puede ser un intermediario (explorer, ShellExperienceHost, navegador), no la aplicación original. Combine proceso, texto, clase y actividad. El canal de eventos NVDA no consulta el Centro de notificaciones ni recupera avisos anteriores. El nuevo canal API Windows sí puede recuperar avisos que Windows todavía conserva. Ningún canal lee la base de datos privada ni recupera avisos eliminados o de otro usuario.

Algunas regiones ARIA web llegan directamente a NVDAHelper por IA2 y no generan el evento global liveRegionChange: no se capturan por esa ruta. No se registra toda la voz, barras de estado, tooltips ordinarios ni cada cambio de interfaz. NVDA y otros complementos pueden filtrar eventos antes. No se garantiza capturar todos los avisos de Windows. Las notificaciones UIA de terminales pueden llegar; excluya su proceso con una regla si lo desea.

El texto UIA procede de displayString, no del nombre del objeto. Otros avisos combinan nombre, descripción, valor y hasta 24 hijos en tres niveles. Máximo 16384 caracteres por entrada. Un presupuesto orientativo de 40 ms entre consultas no puede interrumpir una llamada COM bloqueada. No se conservan objetos COM ni se activan botones de toasts antiguos: actúe desde la aplicación o Windows.

Historial

Primero aparece lo más reciente. Los detalles son texto de solo lectura seleccionable. Combine filtros de texto, proceso, clase, tipo UIA numérico, actividad, clase de ventana, periodo, favoritas y no leídas. Los filtros de texto no distinguen mayúsculas; tipo UIA es exacto.

La vista es una instantánea: Actualizar incorpora nuevos avisos sin reordenarse automáticamente mientras lee. Acciones: detalles, leer, copiar información, favorita sí/no, leída sí/no, crear regla desde la entrada, eliminar seleccionada y vaciar todo. Leer marca como leída; abrir detalles no. Vaciar incluye favoritas.

Exportar JSON/CSV escribe solo la vista filtrada. JSON conserva campos; CSV usa UTF-8 con BOM y neutraliza prefijos interpretables como fórmulas. Las exportaciones son independientes: no se borran al vaciar el historial.

Reglas personales

Pulse Nueva en Reglas. Sus pestañas son Coincidencias, Origen avanzado y Acciones y prueba. Todos los filtros deben cumplirse; vacío no restringe. La primera regla activada coincidente decide todas las acciones. No se acumulan reglas. Edite, duplique, active/desactive, elimine u ordene con Subir/Bajar. Máximo 200 reglas.

Filtros: texto Contiene/Exacto/Regex limitada, mayúsculas del texto, proceso, clase, ventana, tipo UIA y actividad. Proceso, ventana y actividad usan «contiene» sin distinguir mayúsculas. Tipos UIA: 0 añadido, 1 eliminado, 2 acción completada, 3 abortada, 4 otro. Se conservan números desconocidos; procesamiento UIA está en Detalles.

Presentación:

Otras acciones: conservar/excluir del historial y lectura rápida, marcar favorita e intervalo mínimo de sonidos de la regla entre 0 y 86400 segundos.

Elija una ruta absoluta a un WAV existente y pruébelo con Escuchar WAV. Los archivos no se copian. Usa nvwave y preferencias de audio de NVDA; no hay volumen por regla ni cola independiente. Sonidos cercanos pueden reemplazarse.

Probar coincidencia usa texto y proceso de prueba; los otros metadatos se toman de los filtros de la primera pestaña. Comprueba solo esa regla, no toda la lista, y no registra avisos. Una regla desactivada no coincide.

Ejemplo del timbre

Regla «Timbre», texto doorbell pressed, modo Contiene, otros filtros vacíos y WAV C:\sounds\doorbell.wav. Elija mantener anuncio o sustituir por sonido. Después puede restringir por el proceso observado en una entrada real.

Para excluir una aplicación del historial, coloque una regla al principio, filtre proceso y desmarque Guardar en historial. Mantenga anuncio normal si desea seguir escuchándola.

Expresiones regulares limitadas

Se admiten literales, alternativas, grupos sin repetir, anclas, clases y una sola repetición de un carácter, punto o clase. Ejemplos: doorbell pressed, error|warning, ^Descarga, timbre.*pulsado, código [0-9]+.

No se admiten referencias inversas, lookahead/lookbehind, grupos repetidos ni dos cuantificadores. Se rechazan (a+)+, a*b*, (ab)+. Patrón de hasta 256 caracteres; examina los primeros 2048 del aviso. Contiene/Exacto examinan todo el texto conservado. Las restricciones evitan patrones exponenciales en el hilo de NVDA.

Importación y exportación

Exportar reglas crea JSON con esquema 1. Importar añade al final con identificadores nuevos, sin sustituir existentes. Quedan desactivadas para revisar acciones y rutas WAV antes de activarlas.

Importar notificationSounds.conf permite elegir el original, normalmente en %APPDATA%\nvda. Cada línea debe contener expresión, tabulación real y ruta WAV. Admite líneas vacías y comentarios con #. Muestra y omite líneas incorrectas o patrones no admitidos, que deben reformularse. No modifica el original. Desactive el plugin básico anterior para evitar dos reproducciones del mismo sonido.

Ajustes y privacidad

Pulse Guardar ajustes para aplicar esa pestaña. Cerrar sin guardar descarta esos cambios. Las operaciones de reglas se guardan al aceptarlas. API Windows tiene su propio botón Guardar opciones del canal.

Por defecto el historial está solo en memoria. Conservar historial en disco permite recuperarlo tras reiniciar. Se guarda aproximadamente cada 15 segundos, al cerrar el gestor y al terminar NVDA. Un cierre forzado puede perder los últimos segundos.

Datos en notificationManager dentro del perfil de NVDA:

Son texto legible sin cifrar. No se transmiten por red. Diagnóstico muestra la ruta exacta; puede variar en NVDA portátil o con perfil personalizado. Desactivar persistencia elimina el archivo de historial y mantiene la sesión en memoria. Límite inicial: 1000 entradas y 30 días; configurable a 10–10000 y 1–365. Caducidad y límite afectan también a favoritas.

Deduplicación solo para historial y sonidos propios: compara proceso, PID, clase, texto, actividad, tipo y procesamiento UIA; cada repetición renueva la ventana. Por defecto 2 segundos; 0 desactiva. Dos avisos legítimos idénticos pueden agruparse. No suprime globalmente anuncios normales de NVDA.

No molestar conserva avisos permitidos por las reglas sin anuncio ni WAV. Horario local, permite medianoche; inicio igual a fin significa todo el día. No cambia concentración ni banners de Windows, ni sonidos emitidos por otras aplicaciones. Solo afecta a eventos capturados. Con captura pausada deja pasar eventos y no aplica No molestar.

No carga historial en modo seguro ni permite abrirlo o capturar durante bloqueo. La interfaz se cierra al detectarse el bloqueo; la sesión permanece en memoria para después de desbloquear. No copia sus datos a la configuración segura.

Ante archivos dañados entra en solo lectura para no sobrescribirlos. Consulte Diagnóstico, cierre NVDA, conserve copia y renombre el archivo dañado. Al reiniciar usa valores predeterminados; al guardar crea el archivo nuevo.

Desinstalar conserva deliberadamente los datos del perfil. Para retirarlos, vacíe historial, desactive conservación y, con NVDA cerrado, elimine la carpeta indicada por Diagnóstico. WAV y exportaciones son independientes.

Diagnóstico y desarrollo

Si falta un aviso, active captura, actualice, quite filtros y revise reglas de exclusión. Active regiones vivas si corresponde. Puede que el aviso no use una ruta capturada. Diagnóstico y el registro de NVDA muestran incidencias de datos/audio; no se añaden deliberadamente textos de avisos al log.

El código fuente incluye investigación en docs/INVESTIGACION.md, matriz pendiente en docs/PRUEBAS_MANUALES.md y tests. Construya con python -m SCons (Python 3.13, SCons 4.10.1, Markdown y GNU Gettext); pruebe con python -m unittest discover -s tests -v (wxPython para interfaz). La plantilla copia este manual a addon/doc/es, genera HTML y empaqueta.

No se incluyen dependencias binarias ni el árbol de NVDA. Interfaz en español e inglés mediante el sistema gettext de NVDA. Licencia GPL-2.0-or-later: COPYING.txt.

Nuevo en 0.2: API Windows con ctypes

Esta versión añade un canal independiente mediante UserNotificationListener, sin instalar winrt, winsdk, comtypes ni paquetes externos. Las llamadas se hacen a la ABI COM/WinRT de Windows con ctypes de Python. La interfaz sigue utilizando el wxPython incluido en NVDA.

Activarlo

  1. Abra la pestaña API Windows y pulse Comprobar acceso.
  2. Si no hay autorización, pulse Solicitar acceso a Windows y responda al diálogo del sistema si aparece. La solicitud es asíncrona y debe iniciarse desde esta interfaz.
  3. Marque Consultar el Centro de notificaciones y pulse Guardar opciones del canal.
  4. Espere unos segundos y, en Historial, pulse Actualizar. Puede elegir la clase Centro de notificaciones (API Windows).

El canal viene desactivado. No modifica el Registro, la identidad de NVDA, manifiestos de Windows ni concesiones de acceso. Si Windows deniega o no admite la API en esa instalación, muestra el error y el canal de NVDA sigue operativo. Un permiso ya concedido a Python no implica que también esté concedido a nvda.exe. La documentación oficial describe un manifiesto con capacidad userNotificationListener; la disponibilidad sin empaquetado debe comprobarse en cada sistema. No se instala un paquete MSIX auxiliar.

La consulta se realiza en un hilo dedicado cada 5 segundos, configurable entre 2 y 60. No se acumulan consultas. Los errores aumentan progresivamente la espera hasta 5 minutos. La operación asíncrona tiene un plazo de 8 segundos, con cancelación cooperativa; una llamada COM individual bloqueada puede superar ese plazo. No se depende del evento NotificationChanged, que presenta fallos documentados en algunas aplicaciones de escritorio sin empaquetar.

Información adicional

Recupera los avisos que Windows todavía conserva, incluso si se publicaron antes de arrancar el complemento. Obtiene nombre de aplicación, AUMID, ID de Windows, fecha original de creación, título, cuerpo y fecha de captura. Los detalles muestran si el aviso sigue en Windows, ya no aparece o su estado no se pudo comprobar. Que desaparezca no indica necesariamente que el usuario lo leyera: puede caducar o retirarlo la aplicación.

AUMID permite filtrar mejor que el proceso intermediario del shell, aunque no siempre identifica al sitio web o cuenta que originó un aviso dentro de una aplicación. Está en Origen avanzado al editar reglas. El filtro Aplicación / AUMID del historial busca en ambos campos. Crear regla desde una entrada nativa precarga estos valores.

Se detectan altas, cambios de texto y desapariciones entre consultas. Las desapariciones no borran el historial del complemento. Los cambios de texto se conservan como entradas nuevas de la misma identidad Windows. Una captura inicial vacía es válida si Windows mantiene el permiso. Las consultas parciales no se utilizan para afirmar que un aviso fue retirado.

La primera consulta, las reanudaciones tras pausa/bloqueo y la recuperación de un error son silenciosas. Las entradas ya conservadas no se reimportan al reiniciar si coinciden identidad y texto. Al vaciar o eliminar una entrada no reaparece durante la misma sesión por cada consulta; si luego se reinicia o reanuda el canal y Windows aún la conserva, puede volver a importarse. Para excluirla de forma persistente use una regla sin Guardar en historial.

Sonidos y diferencias frente al canal NVDA

Los sonidos de este canal están desactivados inicialmente para evitar duplicarlos. Puede activarlos con Permitir sonidos de reglas para avisos nuevos. El intervalo mínimo por regla, No molestar y exclusiones de historial se respetan. Los avisos históricos nunca disparan sonido.

El canal nativo llega después de la publicación: no puede retirar el anuncio ya realizado por NVDA, ni silenciar sonidos o banners de Windows. En sus reglas, Silenciar/Sustituir no interceptan esa presentación anterior; solo el canal de eventos NVDA tiene esa posibilidad. El nuevo canal puede añadir el WAV configurado si se habilitaron sus sonidos.

Un aviso puede aparecer por ambos canales, con texto o aplicación distintos. No se fusionan por aproximación para evitar mezclar avisos legítimos. Se distinguen por clase. Si activa sonidos nativos, restrinja las reglas a una clase concreta para no reproducir dos sonidos. El canal nativo deduplica mediante aplicación, ID y fecha de creación, independientemente de la ventana de duplicados del canal NVDA.

No recupera avisos ya eliminados, perdidos entre dos consultas, mensajes no publicados como toast, todo tipo de alertas web ni todas las regiones IA2. No utiliza las API de eliminación: borrar del historial del complemento no elimina de Windows. Los avisos nativos están sujetos a las mismas opciones de privacidad, retención y almacenamiento del historial.

Más información en el informe de fuentes del proyecto: docs/API_WINDOWS.md.

Idioma de la interfaz y de la ayuda

La interfaz sigue el idioma configurado en NVDA. Las variantes en_US y en_GB utilizan la traducción inglesa. Reinicie NVDA después de cambiar su idioma. El botón Manual abre la ayuda del idioma correspondiente. El manual inglés se incluye en addon/doc/en/readme.md y addon/doc/en/readme.html; el español permanece en addon/doc/es. Los nombres de reglas, mensajes de aplicaciones y entradas ya guardadas son datos del usuario y no se traducen.