Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
всё о скриптах JAWS.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
312.03 Кб
Скачать

Include файлы проверяются, когда они включаются. Всегда ставьте

оператор Include в своем файле скриптов прежде, чем вы

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

должны включить HJCONST.JSH прежде чем воспользуетесь

какой-нибудь константой оттуда. Конечно, если вы располагаете

свой файл скриптов как положено, все включения будут примерно в

начале файла скриптов.

Ошибочная деятельность

Под ошибочной активностью мы будем подразумевать, что скрипт

работает (то есть, он был скомпилирован должным образом), но

работает не так, как предполагалось. Если ваш скрипт файл

компилируется без ошибок, пора проверить его в предполагаемой

среде. Перед тестированием нет необходимости перезапускать Jaws,

если только вы не модифицировали файл скриптов по умолчанию.

Просто переключитесь на приложение и тестируйте. Вот несколько

советов, которые могут облегчить процесс тестирования

Фрагменты: когда это возможно, компилируйте фрагменты отдельно и

тестируйте, чтобы посмотреть, работают ли они сами по себе.:

Сообщения: в ключевых точках вашего кода можно вставлять

сообщения, чтобы Jaws сообщал, что он делает. ВЫ можете вставить

сообщения SayString в ключевых точках скрипта чтобы посмотреть,

действительно ли они выполняются, когда вы предполагаете это.

Ряд таких сообщений, которые выдают несколько различные

сообщения, могут быть весьма информативными в том, чтобы помочь

вам расшифровать, если код выполняется в том порядке, в каком вы

задумали, и ветвление происходит корректно. Например, сообщения

SayString в каждой ноге утверждения If-Then проинформируют вас,

какая нога выполняется. Вы также можете использовать функцию

SayInteger, чтобы она информировала вас о значениях

целочисленных переменных и о том, как эти значения изменяются в

ходе выполнения скрипта. Вы можете обнаружить, что эти

переменные имеют не те значения, которые вы ожидали, в некоторых

точках выполнения скрипта. Функция SayInteger также может

оказаться полезной в том, чтобы помочь вам отслеживать значения

целочисленных переменных во время выполнения цикла While.

Многие ошибки выполнения можно проследить до сбоя, чтобы

сохранить и восстановить состояния, должным образом. Это

относится к состояниям курсора, состояниям эха экрана,

состояниям подробности и т.д. Всегда, когда вам нужно изменить

состояние для ваших задач, убедитесь, что вы возвращаетесь в

первоначальное состояние. Например, изменение эха экрана на

"Все", так чтобы вы могли всегда слышать подсказку, это конечно

здорово, но не оставляйте систему в таком состоянии поскольку

это может запутать пользователя.

Отладочные скрипты: вы можете создавать отладочные скрипты,

которые будут сообщать всю необходимую информацию, такую, как

активный курсор, что содержится в переменных и различные

свойства окон. Вот пара скриптов, которые вы можете скопировать

и вставить в свой файл скриптов и модифицировать их,чтобы они

сообщали необходимую информацию.

Script SayVars

SayString( MyVariable) ; Наберите имя своей переменной e

; Скопируйте предыдущую строку для каждой своей переменной

EndScript

Script WindowInfo

SayString( GetWindowClass (GetFocus ())) ; Класс окна с фокусом

SayString ( GetWindowClass (GetParent (GetFocus ()))) ; Класс окна для родительского окна

UtilitySayInfoAccess() ; Название элемента управления

EndScript

Взаимодействие ваших скриптов с функциями событий: вы должны

иметь в виду, что у Jaws имеются функции событий, которые

представлены в файле скриптов по умолчанию, которые могут

срабатывать автоматически во время работы приложения. Эти

функции событий могут взаимодействовать неожиданным образом со

скриптами, которые вы пишете. Например, вы можете поместить

функции чтения в свой скрипт, чтобы прочитать определенные части

экрана в определенных ситуациях, только для того, чтобы узнать,

что информация озвучивается дважды. Вероятно, это означает, что

одна из функций событий, как, например, функция NewTextEvent или

функция событий FocusedChanged была вызвана, чтобы озвучить

текст автоматически, а ваш скрипт озвучивает этот текст во

второй раз. Вы не найдете решение этой проблемы, просто

анализируя свой скрипт, поскольку это не ваш скрипт озвучивает

информацию дважды. Вот почему вам так важно четко понимать, что

делают функции событий и когда они будут вызваны приложением.

Домашнее задание # 10

Приведенный скрипт содержит ошибки на каждой строке. Найдите

ошибки и перепишите скрипт правильно.

Script SayDefaultButton (Int Button )

vars

string DefaultButtonName,

if (DialogActive ())

let DefaultButtonName == GetDefaultButtonName

if (DefaultButtonName != " ") then

if (GetVerbosity () = 0) then

SayString ("msg70") ;"default button is"

EndIf ()

SayString (DefaultButtonName))

Else ()

SayString (msg444) : "Can not determine default button in this dialog box "

End If

Else ()

SayString (msg71 ;"not in a dialog box"

EndIf ()

End Script

(cont)

Стратегия атаки на новые приложения

Когда вы впервые открываете новое приложение, особенно то,

которое не является дружественным к речевому доступу, может

оказаться весьма затруднительным решить, как изучить

расположение приложения и как приспособить его для лучшего

доступа. Это руководство познакомило вас с инструментами

создания скриптов, которые помогут вам проделать это. Одна

стратегия подхода к таким приложениям показана в приложении E.

Там вы найдете некоторые идеи о том, как подходить к проблеме

анализа и создания скриптов для нового приложения, в комбинации

с использованием других возможностей Jaws, таких, например, как

использование фреймов.

Рекомендации для создания дистрибутивных файлов скриптов

Мы уже порекомендовали кучу правил для соблюдения, когда

создавали файлы скриптов, такие, как использование подробных

комментариев и тщательное заполнение форм документации к

скриптам. Конечно, это только рекомендации, и никто не может

принудить вас соблюдать эти правила. Однако, если вы намерены

передавать свои файлы скриптов в Henter-Joyce для возможного

включения в будущие версии Jaws, необходимо соблюдать несколько

обязательных правил. Эти правила приведены ниже.

Имена переменных: используйте осмысленные имена переменных,

после которых вставляйте комментарий, когда имя является

недостаточно описательным.

Комментарии: вставляйте комментарии сразу же после начала

каждого скрипта или функции, описывающие его назначение.

Комментарии также необходимо вставлять в сложные утверждения,

где задача не всегда очевидна, такие, как сложные утверждения

типа If-Then-Else.

Сообщения: все озвучиваемые или брайлевские сообщения должны

помещаться в файл сообщений для текущего приложения, где скрипт

может к ним обращаться. Эти сообщения никогда не должны

помещаться в кавычках после SayString в самом .JSS файле.

Соблюдение этого правила делает перевод сообщений на другие

языки куда проще.

Документация к скриптам: заполняйте поля Синопсис и Описание

(Description) в диалоге "Новый скрипт". Они должны заполняться

точно и полностью, поскольку они используются в помощи по

клавиатуре, вызываемой по Insert+F1. Например, в скрипте

SayTextAndAttributes, вы найдете следующий синопсис и описание.

Синопсис: озвучивает изменения в атрибутах, когда читает текст в

активном окне. Описание: читает видимый текст в активном окне не

перемещая курсор. Когда попадаются изменения атрибутов, ОНИ

СООБЩАЮТСЯ.

Убедитесь, что ваш файл скриптов включает настроенные версии

скриптов HotKeyHelp, ScriptFileName, и, если необходимо,

ScreenSensitiveHelp.

Преобразование файлов макросов

Диспетчер скриптов можно использовать, чтобы преобразовать файлы

макросов, которые вы создавали для версий Jaws старше 3.0. Далее

приводятся шаги, которые предпринимает диспетчер скриптов, чтобы

переконвертировать файлы макросов в файлы скриптов.

1. Сначала диспетчер скриптов потребует от вас некоторого ввода.

Когда в меню Файл вы выбираете пункт Импортировать макрофайл, вы

должны будете ввести имя файла макросов. Диспетчер скриптов

использует эту информацию для определения пути и имени файла,

который получится в результате. Вы также должны будете выбрать

среду, для которой создавался макрофайл: Desktop, Laptop или оба

сразу.

2. Диспетчер скриптов создаст пустой файл скриптов, основываясь

целевом пути и имени файла.

3. Файлы включения обрабатываются следующим образом: файл

сообщений копируется в целевую директорию, переименовывается,

получая расширение .JSM, и в .JSS файл добавляется оператор

Inckude.

Макросы в Inckude файлах перемещаются в .JSS файл и

конвертируются. Процедура конвертирования следующая: Если есть

раздел определения глобальных переменных или констант в Inckude

файле, создается .JSH файл и все это переносится туда. В .JSS

файл добавляется оператор Inckude для этого файла

Макросы конвертируются следующим образом: если соответствующая

клавиша обнаруживается в файле раскладки клавиатуры по

умолчанию, основываясь на выбранной среде, скрипту присваивается

соответствующее имя.

Если соответствующая клавиша будет найдена в разделе "Старые

клавиши" файла раскладки клавиатуры по умолчанию, макрос

конвертируется в функцию Jaws с соответствующим именем.

Если соответствия не найдено, скрипту присваивается имя имени

файла, после которого идет номер.

Создается файл раскладки клавиатуры, с присвоениями, основанными

на первоначальных нажатиях клавиш. Макросам, которые

конвертированы в определяемые пользователем функции, клавишных

команд не присваивается, но после имени функции помещается

комментарий, с первоначальным макронажатием клавиши.

Каждое PerformMacro конвертируется в PerformScript, если только

вызванный макрос не был переконвертирован в функцию Jaws. В этом

случае PerformMacro конвертируется в вызов функции

Файл скриптов, который получается в результате, открывается в

диспетчере скриптов.

Предыдущая версия Jaws требовала пробелов между кавычками для

обозначения нулевого значения. В текущей версии нулевые значения

обозначаются просто двумя кавычами без пробелов. Если ваш файл

макросов содержал такие тесты на нулевое значение, вам придется

убирать пробелы между кавычками вручную.

Последнее, что вы должны сделать, это просмотреть скрипты,

изменить имена, если это необходимо, и написать документацию для

каждого скрипта. Если у вас были макросы, служившие в качестве

функций, сконвертируйте их в определяемые пользователем функции.

Затем скомпилируйте новый файл скриптов. Примечание: если вы

вносите обширные изменения в скрипты и функции, вы можете

пожелать компилировать после каждого изменения.

Благодарности

Я хотел бы выразить мою искреннюю благодарность Глену Гордону,

Майку Педерсену, Джозефу Данну, Син Мерфи, Глену Сепку, Джеймсу

Пазуоли, Лесу Криглеру и дасти Ворхису за их страшно полезную

техническую информацию, идеи и рекомендации. Я также хотел бы

поблагодарить Фрэнка Дипалермо который написал первые

руководства по макросам и скриптам, которые послужили отправной

точкой для этого проекта.

Приложение A

Ответы на домашние задания

Ответ на домашнее задание # 1

Script LastFourFiles ()

SpeechOff ()

{Alt+F}

Pause ()

NextLine ()

NextLine ()

NextLine ()

NextLine ()

NextLine ()

NextLine ()

NextLine ()

SpeechOn ()

SayLine ()

NextLine ()

SayLine ()

NextLine ()

SayLine ()

NextLine ()

SayLine ()

SpeechOff ()

{escape}

{escape}

Pause ()

SpeechOn ()

EndScript

Ответ на домашнее задание # 2

Script SpeakWindowState ()

JAWSCursor ()

SaveCursor ()

RouteJAWSToPC ()

JAWSPageUp ()

JAWSEnd ()

PriorWord ()

SayWord ()

RestoreCursor ()

PCCursor ()

EndScript

Обратите внимание, что в этом примере мы активизировали Jaws

курсор, прежде чем использовать функцию SaveCursor. Поскольку

Jaws курсор является активным курсором, когда выполняется

функция SaveCursor, функция RestoreCursor вернет в

первоначальное положение именно Jaws курсор. Функция PCCursor ()

в конце снова включит PC курсор. Это необходимо, поскольку

скрипт, когда работал, включил Jaws курсор.

Ниже приводится ответ на "Отлично"5

Script SpeakWindowState ()

InvisibleCursor ()

SaveCursor ()

RouteInvisibleToPC ()

JAWSPageUp ()

JAWSEnd ()

PriorWord ()

If GetWord () == "Restore Symbol" Then

SayString ("Maximized")

ElIf GetWord () == "Maximize Symbol" Then

SayString ("Restored")

Else

SayString ("Couldn't find the symbol")

EndIf

RestoreCursor ()

PCCursor ()

EndScript

Ответ к домашнему заданию # 3

Script PlaybackPosition ()

SaveCursor ()

RouteInvisibleToPC ()

InvisibleCursor ()

JAWSPageUp ()

NextLine ()

NextLine ()

NextLine ()

JAWSHome ()

SayString ("Current time is")

SayWord ()

SayString ("seconds out of")

NextWord ()

NextWord ()

SayWord ()

SayString ("seconds")

RestoreCursor ()

EndScript

Ответ к домашнему заданию # 4

Include "JAWSWINS.JSH"

Include "JAWSWINS.JMH"

Include "HJCONST.JSH"

Include "HJGLOBAL.JSH"

Ответ к домашнему заданию # 5

Script CheckAndReset ()

Var

String TotalTime ;Хранит полное время звучания звукового файла

SaveCursor ()

RouteInvisibleToPC ()

InvisibleCursor ()

JAWSPageUp ()

NextLine ()

NextLine ()

NextLine ()

JAWSEnd ()

PriorWord ()

Let TotalTime = GetWord ()

JAWSHome ()

If GetWord () == "0.00" Then

SayString ("At the beginning of the recording")

ElIf GetWord () != "0.00" && GetWord () < TotalTime Then

SayString ("Playback only partially complete")

ElIf GetWord () == TotalTime Then

SayString ("Playback is complete.")

JAWSCursor ()

RouteJAWSToPC ()

JAWSHome ()

Pause ()

LeftMouseButton ()

Pause ()

InvisibleCursor ()

If GetWord () == "0.00" Then

SayString ("Rewind complete")

Else

SayString ("Rewind failed. Please check your batteries.")

EndIf

EndIf

EndScript

Обратите внимание, что Jaws может произносить некоторые

дополнительные фразы, такие как "Seek to Start" или "Seek to

End" когда он выполняет перемотку. Все правильно.

Ответ к домашнему заданию # 6

String Function SayAllCaps (string CurrentWord)

If CurrentWord < "a" || CurrentWord > "zzzzz" Then

Return ""

EndIf

If (StringContains (CurrentWord, "a")) || (StringContains (CurrentWord, "b"))

|| (StringContains (CurrentWord, "c")) || (StringContains (CurrentWord, "d"))

|| (StringContains (CurrentWord, "e")) || (StringContains (CurrentWord, "f"))

|| (StringContains (CurrentWord, "g")) || (StringContains (CurrentWord, "h"))

|| (StringContains (CurrentWord, "i")) || (StringContains (CurrentWord, "j"))

|| (StringContains (CurrentWord, "k")) || (StringContains (CurrentWord, "l"))

|| (StringContains (CurrentWord, "m")) || (StringContains (CurrentWord, "n"))

|| (StringContains (CurrentWord, "o")) || (StringContains (CurrentWord, "p"))

|| (StringContains (CurrentWord, "q")) || (StringContains (CurrentWord, "r"))

|| (StringContains (CurrentWord, "s")) || (StringContains (CurrentWord, "t"))

|| (StringContains (CurrentWord, "u")) || (StringContains (CurrentWord, "v"))

|| (StringContains (CurrentWord, "w")) || (StringContains (CurrentWord, "x"))

|| (StringContains (CurrentWord, "y")) || (StringContains (CurrentWord, "z"))

|| (StringContains (CurrentWord, "1")) || (StringContains (CurrentWord, "2"))

|| (StringContains (CurrentWord, "3")) || (StringContains (CurrentWord, "4"))

|| (StringContains (CurrentWord, "5")) || (StringContains (CurrentWord, "6"))

|| (StringContains (CurrentWord, "7")) || (StringContains (CurrentWord, "8"))

|| (StringContains (CurrentWord, "9")) || (StringContains (CurrentWord, "0")) Then

Return ""

EndIf

Return "All Caps"

EndFunction

Script SayWord()