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

За 2018-07-27

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

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

АР> Пробовал обновлять свойство метки accessibleName каждую секунду, но
АР> скринридеры молчат.

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

   2018-07-27 19:48:28 (#3575515)

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

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

> Лучше всего создать класс, который подгружает dll скринридеров и выводит
> строки на проговаривание или брайлевский дисплэй, и скармливать в нужное
> время нужные тексты.

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

> Я так делаю в любых проектах на любых языках, лучше способов не знаю

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

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

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

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

   2018-07-27 15:22:19 (#3575465)

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

Приветствую!
27.07.2018 8:27, Александр Рожков пишет:
> Есть то- же метка label, в которой идет отсчет времени с помощью элемента
> "timer".
> Содержимое метки обновляется каждую секунду.
> Как заставить скринридер проговаривать отсчет времени?
>

Можно включать чтение изменений окна в скринридере, в 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
например, но функциональность может быть ниже, тут не уверен, и где-то
слышал, что это не очень хорошо вплане ресурсов.

   2018-07-27 11:56:26 (#3575431)

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

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

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

> Во-первых, сорри, но зачем? Конкретно для кнопки достаточно же её
> текста, разве нет (свойство Text)?

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

Вы писали:
> Поэтому зависит от того, как ты расставляешь элементы. Лично я
> использую и всем советую TableLayoutPanel.

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

   2018-07-27 08:49:44 (#3575394)

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

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

АР> Иной раз получается добиться проговаривания, но какой-либо
закономерности я
АР> не нашел. :)

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

   2018-07-27 00:12:11 (#3575370)