|
Часть I. Начало работы со скриптамиСоздание простых скриптовПримером простого скрипта может стать скрипт, в котором вы можете прочитать текст, расположенный где-то на экране, с помощью нажатия одной клавиши. Один способ сделать это будет состоять в выборе курсора, перемещении его в заданную точку на экране, где находится текст, и чтении этого текста. В этом разделе мы пройдемся по тому, как создаются такие скрипты, сложив вместе функции, которые и отвечают за подобные вещи. Документация скриптаКаждый скрипт должен быть документирован. Как уже было сказано, вы документируете скрипт при его создании. Далее приводится описание каждого поля, которое требуется для простого скрипта.
Структура отдельного скриптаПомните, что файл скриптов состоит из одного или более скриптов. Как уже было указано, скрипт должен обладать следующей структурой, причем его части должны следовать именно в нижеприведенном порядке: Первым должно стоять ключевое слово "Script", после которого идет пробел. На той же строке, после слова "Script", записывается имя скрипта. Это обычно несколько слов, объединенных вместе, и описывающих действие данного скрипта, например CloseDocumentWindow. Обратите внимание, что каждое из соединенных вместе слов начинается с заглавной буквы, чтобы Jaws мог их корректно прочесть. Затем следует () которая и завершает оператор начала скрипта. Все это автоматически вводится диспетчером скриптов, когда вы создаете новый скрипт с помощью диалога New Script. (если вы обнаружили, что ваша копия Jaws произносит такие слова неправильно, проверьте опцию Mixed Case Processing (Обработка смешанного регистра) раздела Text Processing (Обработка текста) меню Set Options (Установка параметров) в диспетчере конфигурации. Этот блок проверки должен быть включен). Далее следует тело скрипта. Оно состоит из всех инструкций, которые вы добавите при написании скрипта, такие, как объявления переменных, операторы контроля переполнения, вызовы функций, операторы выполнения скриптов, арифметические операции и комментарии. (Вы узнаете о каждом из этих типов инструкций, по мере нашего продвижения по руководству). Скрипт может быть и простым, например, озвучивающим строку, как мы видели в главе "Наши первые скрипты", или он может включать в себя много функций для выполнения сложных операций. Ключевое слово окончания скрипта EndScript всегда стоит в последней строке скрипта. Эта строка автоматически добавляется диспетчером скриптов, когда вы создаете скрипт. Использование функций скриптовТеперь давайте рассмотрим несколько часто используемых функций, с помощью которых можно перемещаться по экрану и читать текст. Чтение текстаНиже приведены некоторые функции, используемые для чтения текста:
Перемещение по экрануПрежде чем вы попытаетесь прочитать что-нибудь на экране с помощью скрипта, вам, вероятно, понадобится переместить один из курсоров к тому месту, где находится объект, который вы хотите прочитать. Следовательно, важно будет понять кое-что о курсорах. Для тех, кто пользуется 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, с помощью которых все можно вернуть в то положение, каким оно было до начала выполнения вашего скрипта. Ниже приводится список функций, которыми можно пользоваться, чтобы выбирать курсоры и манипулировать ими.
Следующая группа функций предназначена для перемещения курсора.
Обратите внимание, что если вашей целью является прочесть что-нибудь на экране, то после функции перемещений обычно следует одна из функций чтения (Say). Пример этого показан ниже. JAWSPageDown () ; перемещает активный курсор к нижнему краю окна SayLine () ; читается строка, на которую поместился курсор Создание скриптов чтенияТеперь давайте рассмотрим, как использовать на практике то, что мы только что узнали. Прежде, чем мы обратимся к реальному скрипту, повторим снова необходимые шаги:
Ниже приводятся два варианта скрипта, которым можно воспользоваться, чтобы прочитать нижнюю строку окна. В конце каждой строки имеется комментарий, который описывает функцию. (прежде мы кратко упомянули о комментариях, в разделе об операторах включения, и ниже мы обсудим их более подробно). В первом скрипте мы переключимся на 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 (). Соединяем все вместеТеперь давайте рассмотрим процесс создания скрипта, закрепления его за определенной клавишей и компиляции файла скриптов, чтобы им можно было пользоваться. Предлагается такой план. Мы создадим скрипт для диспетчера скриптов, который будет читать номер текущей строки. Для этой задачи нам понадобится диспетчер скриптов. Как вы помните, мы уже пользовались этим редактором ранее, когда создавали наши первые скрипты. На этот раз мы заставим диспетчер скриптов поработать на нас немного побольше. В точности выполняйте все шаги:
Но прежде чем мы начнём писать наш скрипт, давайте исследуем окно, чтобы посмотреть, что мы хотим узнать от нашего скрипта. Диспетчер скриптов имеет строку состояния в нижней строке окна, которая содержит подсказку, номер текущей строки и общее количество строк в файле. Мы хотим, чтобы наш скрипт сообщал нам только номер текущей строки. Просто для того, чтобы убедиться в том, что мы знаем, что мы хотим услышать от нашего скрипта, давайте сначала проделаем всю процедуру вручную.
Теперь мы знаем, что должен делать наш скрипт: он должен активизировать курсор, поставить его в нужное место, а затем прочитать слово. Ладно, активизируйте снова 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-2024 |
Социальные сети