
- •Часть I: начало работы со скриптами
- •3.3 В Jaws for Windows появилась возможность загружать файлы
- •Void, если вам не нужно, чтобы ваша функция возвращала какое-либо
- •Insert Function Call - выводит диалог вставки функции, который
- •Insert PerformScript (вставить выполнение скрипта) - при выборе этой
- •InvisibleCursor() - активизирует невидимый курсор.
- •InvisibleCursor() ; активизируется невидимый курсор
- •InvisibleCursor () ; активизируется невидимый курсор
- •InvisibleCursor(), нажимайте Enter, чтобы вставить ее в наш скрипт.
- •Часть II
- •Include "hjglobal.Jsh"
- •IntVar на 1)
- •If (nAttributes & attrib_highlight) Then
- •Visual Basic.
- •If GetExcelVersion Then
- •If (nAttributes & attrib_highlight) then
- •1. Используйте комментарии, комментарии и еще раз комментарии!
- •InvisibleCursor() - активизирует невидимый курсор.
- •2. Диспетчер скриптов проверяет .Jsd файл на наличие строк
- •Include файлы проверяются, когда они включаются. Всегда ставьте
- •If (IsSameScript ()) Then
- •Import Macro File: используется для импорта файла макроса из ранних версий
- •If (GetAttributes() & attrib_underline) then ... (более подробное описание
- •VerbosityLevel - контролирует количество информации, произносимой jfw,
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()