[TC] Re[4]: еще раз о "Джоз и рабочий стол"
Доброго времени суток, Александр.
Привожу фрагмент из руководства
"Когда и как следует использовать фреймы
в Jaws for Windows."
Заранее извиняюсь за длинный текст,
но мне не удалось найти ссылку на это руководство.
К тому же оно достаточно велико и поиск нужного
фрагмента был бы дополнительным препятствием.
Возможно вы заметили, что иногда,
когда вы закрываете приложение, Windows теряет фокус. Получается
так, что Jaws не может сообщить вам заголовок приложения, когда
вы нажимаете Insert+t, и приходится нажимать комбинацию клавиш
Insert+M (ь) чтобы свернуть все приложения и вернуть фокус на
рабочий стол. Автор хотел найти способ минимизировать число
таких примеров потерь фокуса. Потребовались некоторые средства
отслеживания Windows, а также понадобились некоторые средства
для перефокусировки, когда обнаруживалась ситуация потери
фокуса. Проблема была решена с помощью фрейма и пользовательской
функции New Text, как описано ниже.
Способность отслеживания была добавлена посредством
создания фрейма вокруг текстового имени одного из ярлыков на
рабочем столе и помещения этого фрейма в файл фреймов по
умолчанию default.jff. (Файл фреймов по умолчанию использовался,
потому что хотелось, чтобы это все работало всегда, а не только
в одном конкретном приложении). Когда вы закрываете программу,
но фокус не переходит к другой программе, обычно виден рабочий
стол и все его ярлыки. Это означает, что на экране появляются
ярлыки рабочего стола, когда предыдущее приложение закрывается,
а фокус не переходит к другому приложению. Когда такое
происходит, фрейм, который был создан вокруг одного из ярлыков
рабочего стола, будет срабатывать, поскольку название ярлыка
появляется внутри границ фрейма.
ПОсле того, как был создан фрейм с помощью стандартных
методов, описанных выше, автор отредактировал фрейм, внеся
следующие изменения:
1. Эхо фрейма было установлено в значении Highlighted. Как
было сказано выше, для вызова функции New text необходимо
использовать уровень эхо, отличный от JFW Screen echo.
Highlighted было выбрано, поскольку если надо использовать
клавиши стрелки для перемещения по рабочему столу, хотелось,
чтобы Jaws озвучивал имя ярлыка, окруженного нашим фреймом, если
этот ярлык был выделен. Выбор другого уровня эхо наложился бы на
нормальное озвучивание имени ярлыка.
2. Имя нашей новой функции New Text, которую мы назовем
DefaultFocusEvent, было добавлено во вкладке Действие (Action
Tab) в диалоге документации фрейма.
3. Слово "рабочий стол" было удалено из поля Имя во вкладке
Реальное окно (Real window Tab). Наблюдения показали, что если
этого не сделать, фрейм работать не будет.
4. Текстовое имя ярлыка было помещено в поле "Frame must
contain text" во вкладке Реальное окно. Это было сделано для
дополнительной подстраховки, чтобы фрейм запускался только
тогда, когда внутри его границ появлялось бы в точности имя
текстового ярлыка. Возможно, этот шаг не был так уж необходим,
поскольку фрейм, будучи ассоциированным с классом Desktop,
progman, и не запускался бы, если бы вновь появившийся текст не
был ассоциирован с классом progman и тем самым не был бы частью
рабочего стола. Однако, помещение имени текстового ярлыка в поле
"Frame must contain text" добавило некоторую гарантию, что фрейм
не будет срабатывать, когда другой, случайный текст появится в
границах фрейма.
Таким образом, мы создали отслеживающую установку, которая
сообщала бы Jaws, что на экране находится рабочий стол. Теперь
нам нужна дополнительная перефокусировка на рабочий стол, когда
действительный фокус потерян. Это было осуществлено путем
создания пользовательской функции, названной DefaultFocusEvent,
о которой уже говорилось выше, и имя этой функции было
помещено в поле New Text Function вкладки действие (Action Tab).
Эта функция выглядит следующим образом:
Void Function DefaultFocusEvent (handle hwnd, string Buffer, int
nAttributes, int nTextColor, int nBackgroundColor, int nEcho, string
sFrameName)
Var
Int TheControlID,
Handle TheHandle
Pause () ;Allow the system time to stabilize
Delay (5) ;Allow the system time to stabilize
Let TheControlID = GetCurrentControlID ()
Let TheHandle = GetCurrentWindow ()
If (TheControlID == 1) && (TheHandle == 0) Then ;conditions indicative of
focus loss
MinimizeAllApps () ;refocus on Desktop
EndIf
;Now call the standard NewTextEvent function to allow normal text
processing.
NewTextEvent (hwnd, buffer, nAttributes, nTextColor, nBackgroundColor,
nEcho, sFrameName)
EndFunction
Хотя точная природа действия этой функции не имеет прямого
отношения о том, как осуществлять вызов функций New Text с
помощью фреймов, в функцию были добавлены комментарии, чтобы
дать возможность читателю понять, что происходит. Суть
заключается в том, что если фрейм, окружающий ярлык на рабочем
столе, активизируется, будет вызвана вышеприведенная функция.
Затем функция определит, не был ли потерян фокус, и если был,
передаст фокус на рабочий стол с помощью вызова функции
MinimizeAllApps. В конце также был добавлен вызов стандартной
функции NewTextEvent, чтобы Jaws нормально обрабатывал текст во
всех случаях, когда не стоит задача перефокусировки. Без этого
вызова в некоторых случаях рабочий стол озвучивался бы
некорректно. Если бы цель этой функции состояла в том, чтобы
изменить обработку текста, а не активизировать перефокусировку
на рабочий стол, вызов функции NewTextEvent можно было бы и не
включать. Еще раз, точная структура функции New Text будет
определяться природой задачи, которую необходимо выполнить, и
пользователь может научиться создавать такие функции, изучив
руководство по языку скриптов Jaws.
С уважением, Руслан Усачев
RUsach***@t*****.by