Отправляет email-рассылки с помощью сервиса Sendsay

[prg] Проговаривание меток label

Здравствуйте уважаемые подписчики!

Подскажите пожалуйста, как заставить скринридер произносить определенную
метку label, когда фокус попадает на нужный элемент управления?
Использую visual studio 2017, c# и шаблон windows forms.
Пробовал метке выставлять tabIndex на еденицу меньше, чем у элемента
управления, и в свойстве text метки ставить "&", но эти советы, что я нашел
в инете не приводят к положительным результатам.
Иной раз получается добиться проговаривания, но какой-либо закономерности я
не нашел. :)
Поэтому буду очень благодарен за любые подсказки!

Ответить   Wed, 25 Jul 2018 22:48:51 +0500 (#3575234)

 

Ответы:

Здравствуйте Александр,

Попробуйте свойство элемента AccessibleName

С уважением
Владимир

Ответить   vkon@f*****.de Thu, 26 Jul 2018 10:02:54 +0200 (#3575259)

 

Здравствуйте, Vkon .

Вы писали 26 июля 2018 г., 13:02:54:

Спасибо за ответ!
Да, как вариант это свойство я заполнял у элемента управления, но дело
немного в другом.
Обрисую свою проблему более подробнее.
Имеется метка label, где при запуске приложения содержиться один текст,
после совершения какого- либо события, например нажатия на кнопку текст в
label меняется.
Вот для этого и необходимо связать эти элементы, label и button, что- бы при
фокусировании на кнопке, прочитывался label.
К примеру при запуске программы в label будет текст: "нажмите на кнопку".
После нажатия кнопки текст меняется на: "Вы уже нажимали кнопку".
И когда фокус попадает на кнопку, то мы уже будем слышать что кнопка уже
нажималась.
В html, label и какой- нибудь input связываются с помощью id инпута, а здесь
можно ли это как-то осуществить?
Как я уже писал, иной раз получается добиться проговаривания label при
фокусировании элемента управления,
но пока не нашел закономерности, думаю дело в координатах расположения этих
элементах относительно друг друга.

Ответить   Thu, 26 Jul 2018 14:10:56 +0500 (#3575275)

 

Здравствуйте Александр,

при

Вашу задачу понял. Как вариант предлагаю, менять Accessible Name не у label,
а у button, т.е. текст меняется у label, и в это же время меняем AccebleName
у Button.

С уважением
Владимир

Ответить   vkon@f*****.de Thu, 26 Jul 2018 11:56:57 +0200 (#3575282)

 

Vande omentaina, Александр Рожков!

закономерности я

Во-первых, сорри, но зачем? Конкретно для кнопки достаточно же её
текста, разве нет (свойство Text)?
А если хочешь таки связать их, то по сути, всё зависит от
взаиморасположения объектов, а именно, метка
должна быть достаточно близко к кнопке, тогда скринридер её прочитает
(конкретно знаю про JAWS).
Поэтому зависит от того, как ты расставляешь элементы. Лично я
использую и всем советую TableLayoutPanel.

Ответить   Fri, 27 Jul 2018 00:11:11 +0300 (#3575370)

 

Здравствуйте, Menelion .

Вы писали 27 июля 2018 г., 2:11:11:

Да, это так, но я описал свою ситуацию в предыдущем своём письме.
Смысл заключается в прочитывании метки, содержимое которой может меняться.
И необходимо еще читать эту метку при фокусировании определенного элемента.

Вы писали:

Да, спасибо Андрей за добрый совет!
Я уже знаком с этим макетом и он мне тоже очень понравился!
Конечно я бы использовал его, но пока нельзя, задание этого не
предусматривает. :)
Поэтому благодаря Владимиру моя задача решена, но появилась другая проблема.
Думаю не стоит создавать новую тему, ибо эта тема подходит как нельзя
кстати.
Есть то- же метка label, в которой идет отсчет времени с помощью элемента
"timer".
Содержимое метки обновляется каждую секунду.
Как заставить скринридер проговаривать отсчет времени?
Пробовал обновлять свойство метки accessibleName каждую секунду, но
скринридеры молчат.
Буду очень признателен за любые подсказки, а то такие специфические штуки не
найти в сети.

Ответить   Fri, 27 Jul 2018 10:27:38 +0500 (#3575394)

 

Приветствую!
27.07.2018 8:27, Александр Рожков пишет:

Можно включать чтение изменений окна в скринридере, в jaws insert + S,
или в настройках jaws для приложения, чтобы само включалось при открытии
окна insert + V.
В nvda общую настройку тоже можно включить, но не помню как, найти не
сложно.
Понимаю что выход не очень, хотя бы потому, что будет проговариваться
время на часах в системном трее, поэтому:
Лучше всего создать класс, который подгружает dll скринридеров и выводит
строки на проговаривание или брайлевский дисплэй, и скармливать в нужное
время нужные тексты.
У меня есть на проговаривание, делюсь.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace talker
{
static class Talker
{
[DllImport("jfwapi32.dll", CharSet = CharSet.Ansi)]
private static extern bool JFWSayString(string message, bool
interrupt);
[DllImport("nvdaControllerClient32.dll", CharSet =
CharSet.Unicode)]
private static extern int nvdaController_testIfRunning();
[DllImport("nvdaControllerClient32.dll", CharSet =
CharSet.Unicode)]
private static extern int nvdaController_speakText(string text);
[DllImport("nvdaControllerClient32.dll", CharSet =
CharSet.Unicode)]
private static extern int nvdaController_cancelSpeech();

public static bool SayString(string message, bool interrupt = true)
{
bool jfwResult = false, nvdaResult = false;
jfwResult = JFWSayString(message, interrupt);
if (nvdaController_testIfRunning() == 0)
{
if (interrupt)
nvdaController_cancelSpeech();
if (nvdaController_speakText(message) == 0)
nvdaResult = true;
}
return jfwResult || nvdaResult;
}

}
}

ссылка на dll-ки
https://yadi.sk/d/PxupH0as3ZdDd5
dll-ки нужно положить рядом с проектом, там где создаётся исполняемый
файл проекта.
вызываешь в проекте метод SayString, передаёшь строку и пожеланию bool
значение нужно ли перебивать скринридер, или ждать пока договорит.
Второй параметр необязательный, поумолчанию true - перебивать.
функция возвращает bool удалось ли передать одному из скринридеров текст
на озвучку или нет, если скринридеры выгружены, то конечно будет
возвращать false.
пространство имён как и имя класса можешь переименовать.
недостаток, только для jaws и nvda, для других тоже можно сделать, но
мне было ненужным.

П.С. Я так делаю в любых проектах на любых языках, лучше способов не знаю
П.С.2 Ещё можно текст передавать, минуя dll-библиотеки, через COM
например, но функциональность может быть ниже, тут не уверен, и где-то
слышал, что это не очень хорошо вплане ресурсов.

Ответить   Fri, 27 Jul 2018 11:34:15 +0300 (#3575431)

 

Здравствуйте, Бурдин Игорь.

Это ужасное решение. Вспомните исходную постановку задачи: обновление
информации каждую секунду.
Вам бы хотелось работать в интерфейсе, из которого каждую секунду в речевой
API программы экранного доступа отправляются какие-то данные?
Надо сделать обычный элемент progress, через который и отображать динамику
выполнения процесса, если время там представлено как обратный отсчёт.
Если же это просто время от начала и до конца, без понимания общего объёма
задачи, то лучше вообще никак не делать, чем бомбардировать речевые API
каждую секунду. Пользователь сам, при желании, сможет прочитать эту
информацию в окне по запросу, типа Insert+B и всё такое. Для повышения
удобства эти часы можно сделать либо фокусируемым с клавиатуры label, либо в
виде edit read only.

Безотносительно обсуждаемой ситуации, лучшим способом для задач такого
класса является использование универсальных библиотек для работы с речевыми
API программ экранного доступа, например, talk.dll и ей подобных.
Они Они содержат поддержку уже всех основных программ экранного доступа в
общем интерфейсе, а также самостоятельно проверяют их запущенность в
системе. Также умеют, например, перенаправить речевой вывод в SAPI5, если ни
один из чтецов не найден.Например,

com-сервер есть не у каждой программы, равно как не у каждой программы есть
API через dll. По сути, насколько помню, одновременно и то, и другое есть
только у JAWS. Причём, даже у JAWS эти два варианта неэквивалентны и
com-сервер лучше справляется с Unicode. Это как раз и служит неплохим
поводом использовать универсальные решения, чтобы не изобретать лишний раз
велосипед и не реализовывать поддержку всех возможных API с нуля и с учётом
всех нюансов.

Ну а что касается исходной темы, то label надо либо разместить строго над
кнопкой или слева от неё, ну и перед ней в порядке элементов GUI, либо ещё
можно использовать не label, а group с заголовком, обхватив рамкой нужный
элемент управления или группу таких элементов, для которых нужен общий
заголовок.
Единственно JAWS будет читать заголовок group у всех элементов группы, а
NVDA лишь один раз при входе в эту группу. То есть тут уже надо
самостоятельно решать, как кажется лучше с учётом специфики разных программ.
Успехов. Никита.

Ответить   Fri, 27 Jul 2018 14:50:12 +0300 (#3575465)

 

Здравствуйте, Nikita .

Вы писали 27 июля 2018 г., 16:50:12:

Не спорю, но для быстрого решения задачи, такой класс как раз кстати.
Учитывая то, что я еще нетак много знаюь, а для получения некоторой
информации он отлично подойдет.

Да, думаю это эдиальный вариант. Поскольку была задача именно отсчета
времени.
Потом обязательно ради любопытства попробую.
И благодарю за остальные советы и замечания, все постараюсь испробовать и
проверить.

Ответить   Fri, 27 Jul 2018 21:29:59 +0500 (#3575549)

 

Приветствую!
27.07.2018 14:50, "Nikita" пишет:

речевой

Ммм, вопрос был поставлен так:

Есть то- же метка label, в которой идет отсчет времени с помощью элемента
"timer".
Содержимое метки обновляется каждую секунду.
Как заставить скринридер проговаривать отсчет времени?
Пробовал обновлять свойство метки accessibleName каждую секунду, но
скринридеры молчат.

Если это таймер до минуты, то можно сделать и проговаривание каждую
секунду, зависит от задачи Александра, пусть он решает.
Проговаривать можно не каждую секунду, а например десятые секунды, а
последние 5 посекундно проговаривать, при этом на экране показывать все
секунды.
Вобщем закодить можно что угодно, есть ли фокус на каком-то элементе или
нет, и бог знает какие ещё условия, не считаю это ужасным решением.

Поищу, спасибо, хорошо что есть готовое решение для этой задачи.

Ответить   Fri, 27 Jul 2018 21:02:43 +0300 (#3575550)

 

Здравствуйте, Бурдин Игорь.

Вы писали 27 июля 2018 г., 13:34:15:

Нет, не работает! Это я первым делом проверил.

Оо, а за этот класс спасибо!
Подключил, попробовал очень удобно.
Да и мне нужно проговаривать последние 5 сек, а то мешать только будет.

Ответить   Fri, 27 Jul 2018 21:08:42 +0500 (#3575548)

 

Vande omentaina, Александр Рожков!

слушай, я вот прям щас наобум скажу, не гуглив и не тестив, но вроде
же среди ролей есть аналог aria-роли alert. По-моему, так и называется
AccessibleRole = "alert", разве нет?

Ответить   Fri, 27 Jul 2018 19:46:45 +0300 (#3575515)

 

Здравствуйте, Menelion .

Вы писали 27 июля 2018 г., 21:46:45:

Да, есть! Я то- же сначала искал что- то вроде role "status" :)
Alert не срабатывает, а status к сожалению нет.

Ответить   Sat, 28 Jul 2018 11:26:31 +0500 (#3575578)