Всё, что вы хотели знать о написании скриптов для JFW, но не знали, кого спросить

(Переработанный и дополненный вариант)
Источник:www.tiflocomp.ru
Дата публикации:2004
Twitter Facebook Vkontakte

Часть I. Начало работы со скриптами

Создание простых скриптов

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

Документация скрипта

Каждый скрипт должен быть документирован. Как уже было сказано, вы документируете скрипт при его создании. Далее приводится описание каждого поля, которое требуется для простого скрипта.

  • Script Name - введите имя вашего скрипта.
  • Can be attached to Key - всегда устанавливайте этот флажок, чтобы иметь возможность назначить для скрипта комбинацию клавиш.
  • Synopsis - представьте краткое описание назначения вашего скрипта.
  • Description - представьте дополнительную информацию о вашем скрипте.
  • Category - выберите категорию для вашего скрипта. Название категории нужно либо набрать непосредственно, либо выбрать его из списка. Постарайтесь выбирать такие категории, которые будут иметь смысл, чтобы позже перечислить их в логическом порядке, в том случае, если эта возможность будет добавлена в диспетчер скриптов.
Структура отдельного скрипта

Помните, что файл скриптов состоит из одного или более скриптов. Как уже было указано, скрипт должен обладать следующей структурой, причем его части должны следовать именно в нижеприведенном порядке:

Первым должно стоять ключевое слово "Script", после которого идет пробел. На той же строке, после слова "Script", записывается имя скрипта. Это обычно несколько слов, объединенных вместе, и описывающих действие данного скрипта, например CloseDocumentWindow. Обратите внимание, что каждое из соединенных вместе слов начинается с заглавной буквы, чтобы Jaws мог их корректно прочесть. Затем следует () которая и завершает оператор начала скрипта. Все это автоматически вводится диспетчером скриптов, когда вы создаете новый скрипт с помощью диалога New Script. (если вы обнаружили, что ваша копия Jaws произносит такие слова неправильно, проверьте опцию Mixed Case Processing (Обработка смешанного регистра) раздела Text Processing (Обработка текста) меню Set Options (Установка параметров) в диспетчере конфигурации. Этот блок проверки должен быть включен).

Далее следует тело скрипта. Оно состоит из всех инструкций, которые вы добавите при написании скрипта, такие, как объявления переменных, операторы контроля переполнения, вызовы функций, операторы выполнения скриптов, арифметические операции и комментарии. (Вы узнаете о каждом из этих типов инструкций, по мере нашего продвижения по руководству). Скрипт может быть и простым, например, озвучивающим строку, как мы видели в главе "Наши первые скрипты", или он может включать в себя много функций для выполнения сложных операций.

Ключевое слово окончания скрипта EndScript всегда стоит в последней строке скрипта. Эта строка автоматически добавляется диспетчером скриптов, когда вы создаете скрипт.

Использование функций скриптов

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

Чтение текста

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

  • SayCharacter() - читает символ в позиции активного курсора.
  • SayWord() - читает слово в позиции активного курсора.
  • SayToCursor - читает от начала строки до активного курсора.
  • SayFromCursor - читает от позиции активного курсора до конца строки.
  • SayColor - называет цвет шрифта в позиции активного курсора.
  • SayFont - называет шрифт и его размер в позиции активного курсора.
  • SayTextBetween - озвучивает весь текст между двумя координатами столбцов на строке, где находится активный курсор.
  • SayWindow - озвучивает окно в позиции активного курсора.
  • SayToBottom - читает весь текст от позиции активного курсора до нижнего края окна.
  • SayString() - читает текст, заключенный между скобками. Текст должен быть помещен в двойные кавычки.
  • Say - озвучивает строку текста, используя некоторый набор речевых характеристик, называемых средствами вывода. Возможно использовать раздельные способы вывода для озвучивания строк заголовка, органов управления в диалогах, пунктах меню, и т.д.
  • SayAll - читает весь текст от позиции активного курсора до нижнего края окна. Если активным является PC курсор, Jaws прокручивает экран, перемещая PC курсор вниз. Если активным является Jaws курсор, будет прочитана оставшаяся часть окна, путем построчного перемещения Jaws курсора.
  • SayChunk - озвучивает цепочку информации, на которую указывает активный курсор. Цепочка - это текстовая или графическая информация, которая была написана на экране в течение одной операции. SayChunk подобна функции SayField, однако функция SayField использует логику, чтобы определить, какой текст озвучивать, тогда как SayChunk просто читает текст, который был сохранен в модели Off Screen в качестве одинарной единицы.
  • SayField - читает поле текста, на которое указывает активный курсор. Полем называется раздел или блок текста, имеющий общий атрибут, например жирный шрифт, курсив, подчеркивание и т.п. Использование атрибута должно быть непрерывным. Функция SayField использует логику для определения текста, который должен быть озвучен, тогда как функция SayChunk просто читает текст, который был сохранен в модели Jaws Off screen в качестве одинарной единицы.
  • SayFrame - читает содержание указанного фрейма.
  • SayFrameAtCursor - озвучивается весь текст, находящийся в границах фрейма, в котором находится активный курсор.
  • SayFrameAtCursor - озвучивает целочисленное значение данных, часто содержание целочисленной переменной.
  • SayParagraph - читает текущий абзац от начала.
  • SaySentence - читается предложение, которое содержит символ, на который указывает активный курсор.
Перемещение по экрану

Прежде чем вы попытаетесь прочитать что-нибудь на экране с помощью скрипта, вам, вероятно, понадобится переместить один из курсоров к тому месту, где находится объект, который вы хотите прочитать. Следовательно, важно будет понять кое-что о курсорах. Для тех, кто пользуется Jaws без брайлевского дисплея, есть три типа курсора: PC курсор, Jaws курсор и invisible (невидимый) курсор. Те, кто пользуется еще и брайлевским дисплеем, получают и четвертый курсор, Braille курсор. (этот курсор предназначен для внутреннего использования брайлевским дисплеем, и он никогда не должен оставаться после выполнения скрипта). Если вы вводите или редактируете текст, PC курсор будет находиться там, куда будут помещаться символы при их вводе с клавиатуры. (Этот курсор редактирования или вставки также называется курсором каретки). Однако, если вы находитесь в меню или перемещаетесь клавишей Tab по кнопкам в окне диалога, на экране нет курсора каретки. В этом случае PC курсором становится фокус. Если вы хотите прочитать другие области окна, или прочитать часть экрана, куда PC курсор переместиться не может, вы можете переключиться на Jaws курсор. Jaws курсор можно перемещать куда угодно в границах реального окна, что делает возможным исследование областей экрана, куда не может переместиться PC курсор. Кстати, реальным окном называется окно, которое имеет заголовок. Это означает, что в норме ваш Jaws курсор ограничен только перемещением в границах родительского окна наивысшего уровня, с заголовком, начиная от окна, в котором вы в данный момент находитесь. Именно это мы и имеем в виду, когда говорим, что Jaws курсор ограничен границами реального окна (если вы хотите ограничить Jaws курсор границами окна, в котором вы в данный момент находитесь, даже если оно не является реальным окном, вы можете сделать это, воспользовавшись комбинацией клавиш Insert+R). Поскольку Jaws курсор всегда тащит за собой указатель мыши, указатель мыши всегда помещается в позицию Jaws курсора, и его всегда можно щелкнуть, если вы того пожелаете.

Третий вид курсора называется Невидимый курсор (Invisible cursor). В одном отношении этот курсор подобен Jaws курсору, поскольку его перемещение ограничивается только границами реального окна, но на экране нет его видимого представления, поскольку он не тащит за собой указатель мыши.

Как пользоваться курсорами?

Часто бывает непрактично или просто невозможно исследовать экран с помощью PC курсора. Поэтому, прежде чем прочитать какой-либо текст на экране, нам лучше переключиться на какой-нибудь из двух других курсоров.

Для выполнения операций чтения можно использовать как Jaws, так и невидимый курсор, поэтому до определенной степени выбор курсора является вопросом личных предпочтений. Однако, бывают ситуации, когда вам придется предпочесть один из этих курсоров другому. Если вы намереваетесь щелкнуть кнопкой мыши или предпринять какое-либо другое действие с мышью, необходимо будет использовать Jaws курсор. Поскольку указатель мыши сопровождает Jaws курсор в его путешествиях, то щелкнуть мышью становится очень простым делом, поскольку она уже находится в нужной позиции.

Если вы не хотите перемещать Jaws курсор с его текущей позиции, или не будет никакой необходимости на чем-нибудь щелкать, лучшим выбором будет невидимый (invisible) курсор. На ум приходит конкретная ситуация, когда вам уж точно не захочется перемещать указатель мыши/Jaws курсор. Иногда в Windows информационный текст появляется где-то на экране, обычно в строке состояния, когда указатель мыши находится в определенной позиции. Если вы переместите Jaws курсор чтобы прочитать текст, указатель мыши переместится вместе с ним, и текст исчезнет. Чтобы прочитать такой текст, вы должны будете пользоваться невидимым курсором. Да и вообще, было бы неплохо пользоваться невидимым курсором для чтения текста, когда не нужно делать никаких щелчков, если нет конкретной причины использовать Jaws курсор.

В некоторых случаях бывает необходимо переместить один из курсоров, например, Jaws курсор, даже если вы хотите вернуть его в первоначальную позицию, когда скрипт закончит работу. На этот случай имеются функции SaveCursor и RestoreCursor, с помощью которых все можно вернуть в то положение, каким оно было до начала выполнения вашего скрипта. Ниже приводится список функций, которыми можно пользоваться, чтобы выбирать курсоры и манипулировать ими.

  • PCCursor() - активизирует системный курсор.
  • JAWSCursor() - активизирует Jaws курсор.
  • InvisibleCursor() - активизирует невидимый курсор.
  • BrailleCursor () - активизирует брайлевский курсор.
  • RouteBrailleToPc () - перемещает брайлевский курсор к системному курсору.
  • RouteBrailleToJAWS () - перемещает брайлевский курсор к Jaws курсору.
  • RouteJAWSToBraille () - перемещает Jaws курсор к брайлевскому курсору.
  • RoutePCToBraille () - перемещает системный курсор к брайлевскому курсору, если это возможно.
  • RouteJAWSToPC() - перемещает Jaws курсор к системному курсору, если это возможно.
  • RouteJAWSToInvisible() - перемещает Jaws курсор к невидимому курсору.
  • RouteInvisibleToPC() - перемещает невидимый курсор к системному курсору.
  • RouteInvisibleToJAWS() - перемещает невидимый курсор к Jaws курсору.
  • SaveCursor() - сохраняет активный курсор и его позицию.
  • RestoreCursor() - вновь активизирует сохраненный курсор и восстанавливает его в своей первоначальной позиции.

Следующая группа функций предназначена для перемещения курсора.

  • PriorCharacter() - перемещает активный курсор к предыдущему символу.
  • PriorWord() - перемещает активный курсор к предыдущему слову.
  • PriorLine() - перемещает активный курсор на предыдущую строку.
  • NextCharacter() - перемещает активный курсор к следующему символу.
  • NextWord() - перемещает активный курсор к следующему слову.
  • NextLine() - перемещает активный курсор к следующей строке.
  • NextParagraph - перемещает активный курсор к началу следующего абзаца. Если активным является PC курсор, а начало следующего абзаца уже невидимо, то текст в окне автоматически прокрутится, чтобы оно стало видимым.
  • NextSentence - перемещает активный курсор к началу следующего предложения. Если активным является PC курсор, а начала следующего предложения еще не видно, текст в окне будет автоматически прокручиваться, пока начало следующего предложения не станет видимым.
  • PriorParagraph - перемещает активный курсор к началу предыдущего абзаца. Если активным является PC курсор, а начала предыдущего абзаца уже не видно, текст в окне будет автоматически прокручен, чтобы оно стало видимым.
  • PriorSentence - перемещает активный курсор в начало предыдущего предложения. Если активным является PC курсор, а начала предыдущего предложения уже не видно, текст в окне будет автоматически прокручиваться, пока начало предыдущего предложения не станет видимым.
  • JAWSHome() - перемещает активный курсор в начало строки.
  • JAWSEnd() - перемещает активный курсор в конец строки.
  • JAWSPageUp() - перемещает активный курсор к верхнему краю окна.
  • JAWSPageDown() - перемещает активный курсор к нижнему краю окна.
  • MoveTo - перемещает Jaws или невидимый курсор в координаты экрана, указанные пользователем.
  • MoveToControl - перемещает активный курсор к конкретному органу управления внутри окна.
  • MoveToFrame - перемещает активный курсор в левый верхний угол указанного фрейма. Если активным является PC курсор, когда используется эта функция, то активизируется JAWS курсор, и он перемещается в новую позицию, в противном случае перемещается активный курсор.
  • MoveToGraphic - перемещает JAWS курсор, невидимый курсор или брайлевский курсор в указанном направлении, чтобы найти графический символ в активном окне.
  • MoveToWindow - перемещает активный курсор в указанное окно. Если окно содержит текст, то курсор устанавливается на первый символ. В противном случае, он устанавливается в центре окна. Если активным является PC курсор, когда используется эта функция, то активизируется JAWS курсор, и он перемещается в новую позицию.
  • PriorChunk - перемещает активный курсор к предыдущей порции текста. Порция текста - это раздел, или блок текста, который записывается на экране за один раз.
  • NextChunk - перемещает активный курсор к следующей порции текста. Порцией текста называется раздел или блок текста, который записывается на экране за один раз.

Обратите внимание, что если вашей целью является прочесть что-нибудь на экране, то после функции перемещений обычно следует одна из функций чтения (Say). Пример этого показан ниже.

JAWSPageDown () ; перемещает активный курсор к нижнему краю окна
SayLine () ; читается строка, на которую поместился курсор
Создание скриптов чтения

Теперь давайте рассмотрим, как использовать на практике то, что мы только что узнали. Прежде, чем мы обратимся к реальному скрипту, повторим снова необходимые шаги:

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

Ниже приводятся два варианта скрипта, которым можно воспользоваться, чтобы прочитать нижнюю строку окна. В конце каждой строки имеется комментарий, который описывает функцию. (прежде мы кратко упомянули о комментариях, в разделе об операторах включения, и ниже мы обсудим их более подробно). В первом скрипте мы переключимся на JAWS курсор, прочитаем нижнюю строку, а затем оставим JAWS курсор активным в нижней строке окна.

Script ReadBottomLine() ; начинает скрипт и присваивает ему имя ReadBottomLine
JAWSCursor(); активизируем JAWS курсор
RouteJAWSToPC() ; переместить JAWS курсор к PC курсору,
 ;чтобы быть уверенными, что курсор
 ; находится в окне, в котором мы работаем,
 ; а не в каком-то другом окне на экране.
JAWSPageDown() ; перемещаем JAWS курсор в нижнюю строку окна
JAWSHome() ; перемещаем JAWS курсор в начало строки окна
SayLine() ; читаем нижнюю строку окна
EndScript ; конец скрипта

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

Script ReadBottomLine() ; начинает скрипт и присваивает ему имя ReadBottomLine
SaveCursor() ; сохраняет текущий курсор и его позицию
InvisibleCursor() ; активизирует невидимый курсор
RouteInvisibleToPC() ; перемещает невидимый курсор к PC курсору,
 ; чтобы он был в нужном окне
JAWSPageDown() ; перемещает невидимый курсор в нижнюю строку окна
JAWSHome() ; перемещает невидимый курсор в начало строки
SayLine() ; озвучиваем нижнюю строку окна
RestoreCursor() ; восстанавливаем курсор, который мы сохранили, и его позицию
EndScript ; конец скрипта

Посмотрите, как все это работает! Вы могли бы использовать этот скрипт, чтобы читать строку состояния в Microsoft Word. В строке состояния сообщаются номер страницы, номер строки, номер столбца и другая подобная информация. Если вам нужен был только номер страницы, вы могли бы подставить функцию SayWord(), после чего NextWord(), и еще одну функцию SayWord(), вместо функции SayLine(). Тогда вы услышите только слова: страница и номер.

Есть важная тонкость в функциях SaveCursor и RestoreCursor, и эту тонкость необходимо понимать. Эти функции сохраняют, а затем восстанавливают тип курсора, каким бы ни был активный курсор, когда используется функция SaveCursor. Кроме того, если активными являются JAWS курсор или невидимый курсор, когда используется функция SaveCursor, позиция курсора также сохраняется, а затем восстанавливается функцией RestoreCursor. Курсоры, которые активизируются и перемещаются после того, как была использована функция SaveCursor, не будут восстанавливаться в своем первоначальном типе или позициях. Таким образом, в вышеприведенном примере, позиция невидимого курсора не будет восстановлена, если он не оказался активным курсором при вызове функции SaveCursor. Однако, есть возможность использовать несколько утверждений типа SaveCursor и RestoreCursor в одном скрипте. Эти утверждения будут "вкладываться", во многом походя на то, как вкладываются скрипты приложений и скрипты по умолчанию. Это означает, что если вам пришлось воспользоваться вторым утверждением SaveCursor, и вам нужно было иметь активным другой курсор, а не тот, который у вас был, когда вы использовали первое утверждение SaveCursor, то сохранена будет позиция второго курсора, когда SaveCursor будет выполняться во второй раз. Более того, утверждения RestoreCursor будут откатывать утверждения SaveCursor в обратном порядке. Таким образом, если вы выполняете два утверждения SaveCursor, а затем выполняете RestoreCursor, сначала будет восстановлен второй сохраненный курсор. Чтобы вернуть первый SaveCursor, вы должны выполнить RestoreCursor во второй раз. Следующий пример иллюстрирует вложение вызовов функции SaveCursor:

Script ReadBottomLine () ; начинает скрипт и присваивает ему имя ReadBottomLine
SaveCursor () ; мы не знаем, какой курсор был активным,
 ; но мы сохраняем его и его положение
InvisibleCursor () ; активизирует невидимый курсор
SaveCursor () ; сохраняет невидимый курсор и его положение
RouteInvisibleToPC () ; перемещает невидимый курсор к PC курсору,
 ; так чтобы тот находился в нужном окне
JAWSPageDown () ; перемещает невидимый курсор в нижний край окна
JAWSHome () ; перемещаем невидимый курсор в начало строки
SayLine () ; озвучивается нижняя строка окна
RestoreCursor () ; восстанавливается невидимый курсор и позиция, которую мы сохранили
RestoreCursor () ; восстанавливается первоначальный курсор пользователя и положение, которое мы сохранили
EndScript ; конец скрипта

Наконец, если вы используете SaveCursor () в скрипте, Jaws автоматически поместит RestoreCursor () в конце скрипта, даже если вы забудете вызвать эту функцию. Jaws предполагает, что вы хотите восстановить курсор, если вы пользуетесь функцией SaveCursor () в скрипте. Если вы использовали несколько утверждений SaveCursor (), Jaws автоматически вернет их на свои места в обратном порядке, когда скрипт закончит работу, даже если вы забудете поместить все положенные утверждения RestoreCursor ().

Соединяем все вместе

Теперь давайте рассмотрим процесс создания скрипта, закрепления его за определенной клавишей и компиляции файла скриптов, чтобы им можно было пользоваться. Предлагается такой план. Мы создадим скрипт для диспетчера скриптов, который будет читать номер текущей строки. Для этой задачи нам понадобится диспетчер скриптов. Как вы помните, мы уже пользовались этим редактором ранее, когда создавали наши первые скрипты. На этот раз мы заставим диспетчер скриптов поработать на нас немного побольше. В точности выполняйте все шаги:

  1. Запустите диспетчер скриптов, выбрав его в меню Jaws Utilities.
  2. Нажмите Insert+Q чтобы убедиться, что настройки диспетчера скриптов загружены в стек поверх файла скрипта по умолчанию и что имя программы для диспетчера скриптов - jscript.exe. Это, конечно, означает, что текущим файлом, контролирующим Jaws, является jscript.jss.
  3. Чтобы загрузить этот файл, чтобы вы могли его отредактировать, войдите в меню "Файл", нажав ALT+F, нажимайте стрелку вниз, пока не дойдете до пункта "open" и нажмите Enter. В поле редактирования, введите имя файла jscript.jss и нажмите Enter.
  4. Наконец, нажмите Ctrl+End чтобы поместить курсор в конец файла скриптов, то есть, в самое лучшее место для добавления новых скриптов.

Но прежде чем мы начнём писать наш скрипт, давайте исследуем окно, чтобы посмотреть, что мы хотим узнать от нашего скрипта.

Диспетчер скриптов имеет строку состояния в нижней строке окна, которая содержит подсказку, номер текущей строки и общее количество строк в файле. Мы хотим, чтобы наш скрипт сообщал нам только номер текущей строки.

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

  • Сначала активизируйте Jaws курсор.
  • Затем нажмите Pgdn, чтобы встать на нижнюю строку, после чего нажмите Home, чтобы встать в начало строки.
  • Теперь нажмите Insert+5 на цифровой клавиатуре, чтобы озвучить текущее слово, и вы услышите слово "for". Воспользуйтесь командой "Следующее слово" (Insert+Стрелка_Вправо), чтобы прочесть строку слово за словом. Теперь вы знаете, что пятое слово на этой строке является номером текущей строки.

Теперь мы знаем, что должен делать наш скрипт: он должен активизировать курсор, поставить его в нужное место, а затем прочитать слово. Ладно, активизируйте снова PC курсор, и мы начнем.

В меню Script (скрипт) выберите New script (Новый скрипт). Появится диалог нового скрипта. Теперь мы должны назвать наш скрипт и написать его документацию. Когда появляется диалог нового скрипта, курсор находится в поле имени скрипта. Наберите SayLineNumber. Буквы S,L и N должны быть заглавными, никаких пробелов быть не должно.

Нажмите Tab, чтобы переместиться к блоку проверки Can be attached to key (может быть закреплен за клавишей) и нажмите пробел, чтобы включить его. Позже мы закрепим наш скрипт за клавишей.

Нажмите Tab, чтобы переместиться к полю Synopsis и наберите "читает номер текущей строки".

Нажмите Tab, чтобы переместиться к полю Description (описание) и наберите "строку, которая содержит PC курсор".

Нажмите Tab, чтобы переместиться в поле "Category" (категория) и наберите "Say", потому что наш скрипт будет что-то говорить.

Нажмите Tab, чтобы переместиться в поле Assign To (закреплен за) и нажмите Shift+Ctrl+L, чтобы закрепить эту комбинацию клавиш за скриптом SayLineNumber.

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

Теперь у нас есть скрипт с утверждением begin с именем скрипта и утверждение EndScript. Между ними имеется несколько пустых строк, куда мы и должны вводить наши утверждения, и курсор находится на одной из пустых строк. Нажимайте клавишу "Стрелка вверх", пока не окажетесь на первой пустой строке скрипта.

На этот раз мы не будем писать имена функций вручную, как мы это делали в случае с нашим первым скриптом. Мы воспользуемся диалогом диспетчера скриптов Insert Function (Вставить функцию).

Выберите Insert Function Call (вставить вызов функции) в меню Скрипт или воспользуйтесь горячей клавишей Ctrl+I. Появляется диалог вставки функции и курсор устанавливается в поле редактирования имени функции. Под полем редактирования имени функции также выводится список всех функций. С помощью клавиши Tab можно переместиться в этот список и с помощью клавиш-стрелок найти ту, которая вам нужна, но это не очень-то эффективно, поскольку их больше двух сотен. Jaws имеет способ получше, но он требует, чтобы вы имели хоть какое-то представление об имени функции.

Как и в нашем предыдущем примере, мы должны начать с сохранения курсора и его положения. Функция будет SaveCursor(), но нам нужно будет нажать только букву S, после чего инструмент Insert Function начнет искать сразу же, как только вы начнете набирать. SaveCursor() - это первая функция, которая начинается с буквы S. Обратите внимание, что как только фокус переместился к SaveCursor(), было прочитано сообщение-подсказка, объясняющая, как используется эта функция. Нажмите Enter, и функция поместится в наш скрипт. Просто, не правда ли?

Теперь давайте активизируем невидимый курсор. Здесь мы используем невидимый курсор, поскольку мы хотим просто прочитать номер строки и вернуться. Нет никакого смысла тащить с собой мышь, поэтому мы не будем пользоваться Jaws курсором. Нажмите Enter, чтобы вставить новую строку, а затем снова CTRL+I.

На этот раз нам нужна функция InvisibleCursor(). На этот раз нам придется набрать две буквы, поскольку InvisibleCursor() - это не первая функция, которая начинается на букву I. Набирайте медленно, чтобы вы успевали услышать, какая функция высвечивается. Как только вы услышите InvisibleCursor(), нажимайте Enter, чтобы вставить ее в наш скрипт.

Воспользуйтесь аналогичной процедурой, чтобы добавить остальные наши функции, в таком порядке:RouteInvisibleToPC (), JAWSPageDown(), JAWSHome(), NextWord() 5 раз, SayWord() и RestoreCursor(). Нажмите CTRL+S, чтобы скомпилировать файл скриптов. Если вы не сделали ни одной ошибки, вы услышите сообщение "compile complete" (компиляция завершена). Если вы этого не услышали, повторите предыдущие процедуры, пока не сможете скомпилировать без ошибок. Если вы получите ошибку, диспетчер скриптов поместит курсор примерно в то место, где, по его мнению, допущена ошибка, так что вы будете иметь лучший шанс ее найти.

Теперь проверьте свою работу, нажав Ctrl+Shift+L, чтобы услышать номер текущей строки. Попробуйте некоторые вариации, как, например, озвучивание целой строки, вместо отдельного слова. Затем добавьте сообщение "Строка номер" перед тем, как будет фактически озвучен номер строки. Когда вы освоитесь с этим процессом, либо переходите к следующему разделу, "Создание сложных файлов скриптов", или перескакивайте и напишите какие-нибудь скрипты, которые вам хотелось написать.

Домашнее задание № 2.

А вот вам второе домашнее задание. Как вы, вероятно, знаете, большинство окон имеют три состояния: свернутое, распахнутое и восстановленное. В правом верхнем углу большинства окон есть три кнопки. Первая - свернуть, а последняя - закрыть. Средняя может быть либо "распахнуть", либо "Восстановить", в зависимости от текущего состояния окна. Переместившись к средней кнопке и прочитав ее, вы можете определить состояние окна. Если произносится "Restore Symbol", (Символ восстановить), то окно распахнуто. Если озвучивается "Maximize Symbol" (символ Распахнуть), то окно является восстановленным. Ваше задание - написать скрипт для файла скриптов по умолчанию default.jss, который будет читать эту кнопку. Конечно, чтобы протестировать свой скрипт должным образом, убедитесь, что вы находитесь в окне, в котором эти кнопки есть. Окно диспетчера скриптов послужит прекрасным примером. После того, как вы напишете этот скрипт, вы сможете определять текущее состояние окна с помощью одного нажатия клавиши. Мы хотим, чтобы в этом задании вы использовали Jaws курсор, и вы должны убедиться, что Jaws курсор возвращет на прежнюю позицию к тому времени, когда скрипт закончит работу. Предположите, что PC курсор является активным когда вы начинаете скрипт, и убедитесь, что он является активным, когда скрипт выполнен.

Вы можете загрузить файл скриптов по умолчанию выбрав диспетчер скриптов из меню утилит окна Jaws, а затем загрузить default.jss. Альтернативным способом проделать это является нажатие CTRL+SHIFT+0 на основной клавиатуре. Автоматически откроется диспетчер скриптов и загрузится файл default.jss. Добавьте свой скрипт в конец этого файла.

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

Дополнительное задание - если вы чувствуете тягу к приключениям, попробуйте модифицировать вышеприведенный скрипт, чтобы он был немного более разумным. Вместо того, чтобы просто читать символы Maximize и Restore, используйте If-Then, ElIf, Else, GetWord, и функции SayString чтобы решить, каково состояние окна и какое сообщение нужно читать. Если окно показывает символ "Восстановить", пусть скрипт говорит "распахнуто", а если показан символ "Восстановить", пусть скрипт говорит "Восстановлено". Если ни одного из этих двух символов найдено не будет, пусть он скажет "НЕ могу найти символы". Намек - графика, имеющая ярлыки, такая, как символы восстановления или распахивания, может интерпретироваться как текст, и ее ярлык можно читать и им можно манипулировать с помощью тех же функций, которые используются для чистого текста.

Домашнее задание №3

И просто для смеха, вот вам третье домашнее задание. Windows поставляется с программой звукозаписи, которая называется Фонограф. Обычно эту программу можно найти в папке Multimedia папки "дополнительные возможности" в главном меню. Откройте ее, и поизучайте ее окно с помощью Jaws курсора, если вы не знакомы с этой программой. Вы обнаружите несколько кнопок для воспроизведения, записи, остановки и т.д. Вы также обнаружите, что на четвертой строке сверху имеется счетчик, который сообщает вам, сколько секунд проиграно и сколько секунд длится файл. Загрузите какой-нибудь файл на вашем компьютере с расширением .wav, воспользовавшись диалогом "Открыть" в меню "Файл". (вы найдете много .wav файлов в папке C:\WINDOWS\MEDIA. Щелкните кнопку Play, чтобы начать проигрывание, затем щелкните кнопку Stop до того, как файл будет проигран до конца. (если вы предпочитаете пользоваться клавиатурой для этих процедур, горячими клавишами для этих функций являются CTRL+P и CTRL+S соответственно). Если вы теперь посмотрите на счетчик прошедшего времени, то вы увидите, что там появились цифры, указывающие, сколько времени прошло из суммарного количества времени. Мы хотим, чтобы вы написали скрипт для файла скриптов этого приложения (SNDREC32.JSS), который будет читать вам этот счетчик по одному нажатию клавиши. Сообщение должно быть в форме "текущее время X секундс, из Y секунд". Значения X и Y нужно брать с дисплея счетчика фонографа, а остальная часть сообщения должна быть создана с помощью утверждений SayString. Для чтения воспользуйтесь невидимым курсором, и верните начальный курсор в первоначальное положение, когда скрипт закончит работу.



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2019