|
Часть II. Создаём сложные файлы скриптовФункции, определяемые пользователемС помощью языка сценариев можно написать определяемую пользователем функцию (или пользовательскую функцию). Разница между встроенной функцией и функцией, определяемой пользователем,состоит в том, что функции, определяемые пользователем, можно модифицировать, в то время как встроенные функции модифицировать нельзя, так как они запрограммированы в Jaws. Разница между определяемой пользователем функцией и скриптом состоит в том, что скрипт может быть привязан к клавише и не возвращает никакого значения, а пользовательская функция не может быть привязана к клавише и возвращает значение определенного типа. Пользовательские функции запускаются всякий раз, когда они вызываются из скрипта или из другой определяемой пользователем функции. Простые функцииОпределяемые пользователем функции обычно создаются как самостоятельные модули скриптового кода, который предназначен для выполнения конкретной задачи. Это особенно полезно, когда работа, которую должна выполнить функция, будет выполняться большое количество раз и разными скриптами. Это позволяет многократно использовать код функции, не переписывая его несколько раз. Все, что должен сделать пользователь, это вызвать функцию из другого скрипта или функции, и работа будет выполнена. Затем вызванная функция возвращает управление обратно вызывающему скрипту или функции, который, в свою очередь, продолжает свою работу. Простейший тип функции не принимает никаких данных (параметров) и не возвращает никаких значений в вызывающий скрипт. Давайте рассмотрим пример определяемой пользователем функции, который взят из файла скриптов для Microsoft Excel, EXCEL.JSS. Этот скрипт называется NextSheet, и в его задачу входит переместить фокус к следующей таблице. Вот код из скрипта: Script NextSheet() ;переходит в следующую таблицу и читает номер {CONTROL+PPAGE DOWN} Delay (1) SayWindowPromptAndText() EndScript Обратите внимание, что скрипт вызывает функцию, которая называется SayWindowPromptAndText. Вы не найдете этой функции среди встроенных функций Jaws. Это пользовательская функция, которая была написана программистами из Henter-Joyce и включена в EXCEL.JSS. Ниже приводится код для SayWindowPromptAndText. Function SayWindowPromptAndText () SaveCursor () InvisibleCursor () RouteInvisibleToPC () If (FindLastAttribute (ATTRIB_BOLD)) Then SayChunk () Else SayString (msg121) ;"bolded sheet tab not found" EndIf EndFunction Давайте теперь пройдемся по процедуре создания простой пользовательской функции. В качестве примера рассмотрим создание функции, которая будет озвучивать наше имя, точно также, как мы это сделали в нашем первом скрипте. Как и прежде, мы поместим эту функцию в файл скриптов для редактора "Блокнот" (Notepad).
Теперь мы создали функцию, которая будет выполнять ту же самую работу, что и наш первый скрипт. Эту функцию можно вызвать всякий раз, когда нам понадобится озвучить наше имя. Чтобы вызвать функцию, мы должны будем использовать скрипт, код которого приведен ниже. Script SpeakName () SayName () EndScript Этот простой скрипт будет вызывать функцию, которая будет озвучивать наше имя. Теперь может показаться немного глупо, проходить через все эти проблемы, когда мы могли бы выполнить ту же самую задачу с помощью нашего первого скрипта. Конечно, для простого случая, как этот, может быть оно и так. Однако, функции могут быть длинными и сложными. В случаях таких сложных функций будет очевидным, что будет проще создать код один раз, а потом вызывать его всякий раз, когда он нам понадобится. Иначе нам пришлось бы воссоздавать весь этот код для каждого конкретного скрипта, где он понадобится. Определяемая пользователем функция, которую мы обсуждали несколькими абзацами выше, это самый простой вид определяемых пользователем функций, потому что он не требует никаких параметров и не возвращает никаких значений в вызывающий скрипт. Однако, определяемые пользователем функции могут делать и то, и другое. Давайте рассмотрим примеры таких функций. Функции с параметрамиПервый пример - это функция, которая принимает параметры. Помните, что параметр - это данные, которые вы передаете в функцию, чтобы она использовала их при работе. Единственная причина, почему мы передаем эти данные во время работы, а не включаем их как часть кода, состоит в том, что данные могут быть разными при каждом вызове функции. Помните, что параметр объявляется как переменная, но помещается между скобками, следующими после имени функции, а не после слова "var". Function ScriptAndAppNames (string sFileName) If (GetVerbosity() == beginner) Then SayString(sFileName + " settings are loaded") else SayString (sFileName+" Settings") EndIf If(GetVerbosity() == beginner) Then SayString ("The application currently being used is the ") EndIf SayString (GetAppFileName ()) SpellString (GetAppFileName ()) EndFunction Можно представить, что строковый параметр, sFileName, является дверью, через которую мы можем передать имя текущего файла скриптов в функцию, когда она вызывается. Параметр sFileName не равен filename, он более похож на переменную, которая будет временно хранить имя файла, чтобы имя файла можно было передать в функцию, которая будет его использовать. Вызов функции будет записан следующим образом: ScriptAndAppNames ("ApplicationName") где ApplicationName представляет имя приложения, которое вы хотите передать в функцию. Этот вызов функции говорит, что строка (string) "ApplicationName", должна быть передана в функцию, ScriptAndAppNames, через параметр sFileName. Тогда функция будет "знать" эту информацию. Следовательно, она может быть использована в речевых сообщениях, которые содержатся в утверждениях типа SayString. Здесь информация о параметре соединяется с фиксированным текстом, чтобы завершить сообщения, которые будут озвучены во время выполнения. Давайте возьмем функцию, которую мы написали прежде, SayName, и переформулируем ее таким образом, чтобы она принимала наше имя в качестве параметра, вместо того, чтобы иметь наше имя в коде функции. Выполните шаги, приведенные ниже.
Теперь мы создали функцию, которая будет выполнять ту же работу, что и наша предыдущая функция. Однако, имя, которое нужно озвучить, не закодировано в функцию, оно передается как параметр. Эту функцию можно вызывать всякий раз, когда нам нужно озвучить наше имя. Чтобы вызвать функцию, мы будем использовать скрипт, сформулированный, как показано ниже. Script SpeakName () SayName ("XXX") EndScript Когда вызывается функция SayName, строка "XXX", которая представляет наше имя, передается в функцию через параметр UserName. Теперь у функции есть эти данные и она может озвучить его как часть сообщения SayString. Функции, возвращающие значенияТеперь давайте рассмотрим функцию, которая возвращает значение. Возвращаемое значение - это данные, которые посылаются функцией в вызывающий скрипт, когда она завершает работу. Эти возвращенные данные затем могут быть использованы вызывающим скриптом или функцией. Обратите внимание, что тип возвращаемого значения (то есть, string, Int, Object, handle, или Void) объявляется перед именем функции. Следующая функция взята из EXCEL.JSS, файла скриптов для Microsoft Excel. Int Function GetExcelVersion() var handle WinHandle let WinHandle = GetAppMainWindow (GetFocus()) let WinHandle = GetFirstChild (WinHandle) If (GetWindowClass (WinHandle) == "Excel4") then return TRUE ;This is Excel 97 Else return FALSE ; this is Excel95 or earlier EndIf EndFunction Вы, вероятно, догадались, что задача этой функции состоит в том, чтобы определить, находимся мы в Excel 97 или нет. А происходит следующее: функция выполняет тест, чтобы узнать, находимся ли мы в Excel 97. Если да, функция возвращает, или посылает обратно, значение True, Истина, обратно в вызывающий скрипт. Если нет, возвращается значение False, или ложь. Под возвратом этого значения мы просто имеем в виду, что мы информируем вызывающий скрипт о результатах определения. Вызывающий скрипт может потом продолжать и делать что-то другое, в зависимости от того, является значение True или False, то есть находимся ли мы в действительности в Excel 97 или нет. Вот пример того, как можно вызвать эту функцию таким образом, чтобы возвращенную информацию можно было использовать для принятия решения. If GetExcelVersion== true Then (набор команд, которые нужно выполнить для Excel 97) Else (набор команд, которые нужно выполнить для других версий Excel) EndIf Другими словами, если GetExcelVersion является истинной, то есть, возвращает True, то мы выполним один набор утверждений. Если она не является истинной, то есть возвращает False, то мы выполним другой набор. Кстати, вам пора выучить сокращение, которое авторы скриптов часто используют в таких ситуациях, как эта. Следующее утверждение немного короче, чем If GetExcelVersion== true Then, но оно означает абсолютно то же самое. If GetExcelVersion Then Когда вы видите такие утверждения, понятно, что мы подразумеваем "== true". Оно опускается для удобства, но каждый должен понимать, что "== true" или "== 1" (которые, как мы теперь знаем, являются эквивалентными утверждениями),всегда подразумевается в такого рода утверждениях. Домашнее задание # 6Jaws произносит большие буквы, озвучивая их с другой высотой тона. Некоторые пользователи хотели бы слышать перед словами, целиком написанными заглавными буквами, сообщение "Все большие" ("all caps"), когда они произносятся по буквам. Напишите функцию под именем SayAllCaps, которая будет выполнять следующее:
Совет: это довольно сложная работа, поэтому мы собираемся дать вам подсказку. Вы должны будете использовать встроенную функцию, StringContains, чтобы определить, содержит ли слово какие-либо строчные буквы. (это единственная встроенная функция Jaws, которая является чувствительной к регистру). Как только тест определяет, что представленная буква не является заглавной, должен осуществляться возврат пустой строки, поскольку дальнейшего тестирования не требуется. Если букв в нижнем регистре найдено не будет, она должна возвратить строку "all caps". Функция также должна возвращать нулевую строку, если встретится какое-либо число, чтобы предотвратить появление сообщения "all caps" на каждой встретившейся цифре. И наконец, функция должна содержать код, который не давал бы ей выдавать сообщение "All Caps", если курсор находится на пустой строке, или на знаке препинания, или на любом другом неалфавитном символе. Чтобы выполнить эту задачу, вы должны знать, что все такие неалфавитные символы имеют значение меньшее, чем буква A или большее, чем буква Z. Вы должны протестировать слово, чтобы посмотреть, удовлетворяет ли текущее слово этому критерию и возвращать нулевую строку, если удовлетворяет. (К сожалению, этот способ не подходит для букв русского алфавита.) Наконец, чтобы использовать эту функцию в народном хозяйстве, придется модифицировать скрипт, который называется SayWord, который можно найти в DEFAULT.JSS. Вы должны модифицировать этот скрипт, чтобы он вызывал функцию SayAllCaps в нужное время и выполнял тест. SayWord активизируется, когда вы нажимаете комбинацию клавиш Insert+5 на цифровой клавиатуре. Скрипт SayWord имеет начальный раздел, который использует встроенную функцию IsSameScript чтобы проверить, не нажали ли вы Insert+5 на цифровой клавиатуре дважды быстро. Если быстро нажать эту комбинацию клавиш дважды, Jaws получит задание произнести слово по буквам, а не просто озвучить его. Поместите свой вызов функции SayAllCaps в скрипт в нужное место и вызовите ее с таким расчетом, чтобы она озвучивала строку, возвращенную функцией, сразу же перед тем, как она произносит слово по буквам. Если функция нашла, что не все слово написано в верхнем регистре, она вернет нулевую строку, и таким образом, не скажет ничего. Если функция обнаружила, что все слово написано в верхнем регистре, она возвратит строку "All Caps", которую вы затем услышите непосредственно перед тем, как слово будет произнесено по буквам. Последний совет: вы должны будете вызывать функцию внутри утверждения SayString, чтобы услышать, как будет озвучена ваша возвращенная строка. Функции событийСуществует также особая категория определяемых пользователем функций, название которых оканчивается словом Event (Событие). Такие функции называются функциями событий (или событийные функции, или обработчики событий), и они выполняются автоматически, всякий раз, когда происходит ассоциированное с ними событие. Например, функция, которая называется MouseMovedEvent работает, всякий раз, когда указатель мыши изменяет положение. Задача событийных функций состоит в том, чтобы позволить Jaws выполнять специфические задачи автоматически, не ожидая, когда пользователь инициирует действие с помощью нажатия клавиш. Здесь требуется некоторое пояснение. Мы называем функции событий определяемыми пользователем функциями, потому что некоторые пользователи программируют или модифицируют их содержимое. Однако, событийные функции отличаются от других определяемых пользователем функций, потому что пользователи не могут изобретать новые функции событий. Те, которые существуют, являются таковыми, поскольку они были запрограммированы в Jaws, чтобы там существовать. Пользователи могут изменять код, который содержится в этих функциях, но не могут создавать событийные функции с новыми именами. Существует несколько системных событий, которые могут запустить функцию. Когда происходят такие события, они часто передают параметры в функции, и эти параметры могут быть использованы кодом функций событий. Вот пример функции такого типа, AutoStartEvent, которую вы найдете в большинстве файлов скриптов. Function AutoStartEvent() If (GetWindowName (GetFocus ())== wn292) && SDMGetFocus (GetFocus ())== 18 Then ; on check box SDMSayControl (GetFocus (), 17) ; say the tip of the day SDMSayControl (GetFocus (), 18) ; say check box EndIf ; tip of the day If (WinWordFirstTime == 0) Then let WinWordFirstTime = 1 let GlobalWinwordVersion = FALSE if GetVerbosity() == beginner Then SayString(msg293) ;"Use Insert plus the letter H for help in various dialog boxes" EndIf ; verbosity beginner EndIf ; first time EndFunction Функция AutoStartEvent вызывается всякий раз, когда загружается файл скриптов. Эта функция взята из файла скриптов для Microsoft Word. Она озвучивает совет дня, если он является видимым, устанавливает несколько переменных, а затем озвучивает подсказку Jaws. Она также проверяет, является ли это первый раз, когда функция AutoStartEvent отрабатывает во время текущей сессии Jaws. Если это так, она изменяет значение переменной WinWordFirstTime с 0 на 1. Когда в следующий раз AutoStartEvent будет выполнять свою работу, она пропустит сообщение-подсказку. Это полезный способ, который можно использовать, когда вы хотите, чтобы скрипт делал что-нибудь, когда приложение загружается в первый раз, но хотите избежать этого при активизации уже загруженного приложения (то есть когда фокус переходит к этому приложению). Если вы хотите, чтобы что-нибудь происходило при каждом активизации приложения, просто поместите код в функцию AutoStartEvent, без всяких окружающих его условных утверждений. Эта функция не принимает никаких параметров и не возвращает ничего (впрочем, все событийные функции не возвращают никаких значений). Теперь давайте рассмотрим более сложную функцию, которая принимает передаваемые ей параметры. Это функция NewTextEvent, которая обрабатывает весь новый текст, появляющийся на экране. Void Function NewTextEvent (handle hwnd, string buffer, Int nAttributes, Int nTextColor, Int nBackgroundColor, Int nEcho, string sFrameName) ; Обрабатывает весь новый текст. Если текст содержится во ; фрейме, то имя фрейма передается в качестве параметра if (ProcessSelectText(nAttributes, buffer)) then return EndIf if (sFrameName == "") then ; Этот текст не ассоциирован с фреймом if (nAttributes & ATTRIB_HIGHLIGHT) then SayHighlightedText(hwnd, buffer) else SayNonHighlightedText(hwnd, buffer) EndIf else ; Этот текст ассоциирован с фреймом if (nEcho == ECHO_NONE) then return; frame is being silenced EndIf if (nEcho == ECHO_ALL || (nAttributes & ATTRIB_HIGHLIGHT)) then ; if Frame echo is set to all or the text being written is highlighted SayString(buffer) EndIf EndIf EndFunction Это функция NewTextEvent из файла скриптов по умолчанию. Обратите внимание, что можно сказать, что эта функция ничего не возвращает, потому что начальный оператор функции начинается со слова Void. Все параметры для этого события объявлены между левой и правой скобками в начальном операторе функции. (помните, что такие параметры первоначально объявлялись в разделе Параметры диалога Новый скрипт, который используется для определения и документирования нового скрипта или функции). Вызовы для этой функции событий должны содержать переменную для каждой из предзаданных параметров между скобками утверждения, вызывающего функцию. Далее приводится описание каждого параметра для NewTextEvent:
Как мы уже сказали раньше, эта функция вызывается автоматически всякий раз, когда на экране пишется новый текст. Jaws автоматически передает значения этих семи параметров в функцию, когда она вызывается. Используя логику и выполняя сравнения этих данных, функция может определить, какого рода текст был написан, ассоциирован ли он с фреймом, и что Jaws должен озвучивать, и должен ли он вообще что-то озвучивать. Если бы это не была функция события, пользователю пришлось бы вызывать ее из другой функции или скрипта, и для вызова этой функции ему пришлось бы указать переменные, которые используются для передачи требуемой информации. Но поскольку это функция события, Jaws автоматически выполняет эту работу всякий раз, когда на экране появляется новый текст. Есть смысл изучить эту событийную функцию, чтобы понять, как Jaws выполняет такие сравнения и как функции вызываются из других функций. Первая строка после начальных комментариев в этой функции является следующей: if (ProcessSelectText(nAttributes, buffer)) then Эта строка является оператором If-Then, вызывающий функцию по имени ProcessSelectText. Эта функция занимается озвучиванием текста, по мере его выделения или снятия выделения. Синтаксис этого утверждения абсолютно идентичен тому, как если бы было написано: if (ProcessSelectText(nAttributes, buffer) == True) then Та часть, которая говорит "== true" всегда подразумевается, даже если она опускается. Поэтому, если этот вызов функции возвращает значение True, тогда следующая строка, Return, будет выполнена. А происходит то, что функция NewTextEvent передает задачу определения,происходит ли выделение текста, или происходит снятие выделения , в функцию ProcessSelectText. Если эта функция решает, что происходит выделение текста или выделение снимается, она производит необходимое озвучивание и функции NewTextEvent больше делать нечего. Таким образом, когда управление возвращается в функцию NewTextEvent возвращением истины, то функция NewTextEvent завершает работу через при помощи оператора Return, и работа окончена. Если функция ProcessSelectText возвращает False, значит, текст не помечается для выделения или для снятия выделения, утверждение If-Then является ложным и функция NewTextEvent продолжит работу. Следующая строка в этой функции такая: if (sFrameName == "") then Поскольку параметр sFrameName передает имя любого фрейма, содержащего новый текст, в функцию NewTextEvent, этот параметр будет иметь нулевое или пустое значение, если текст не ассоциирован с каким-либо фреймом. Нулевое значение для имени фрейма указывается двумя кавычками, между которыми нет никакого текста. Таким образом, если с текстом не ассоциировано никаких фреймов, никакого имени фрейма не будет, нулевое значение, и утверждение If-Then будет истинным. Тогда будет выполняться следующее утверждение в последовательности. Если утверждение If-Then является ложным, имея в виду, что есть фрейм, тогда выполнение перескакивает в другую точку скрипта, которая обрабатывает текст, ассоциированный с фреймом. Предполагая, что фрейма нет, далее обрабатываются следующие утверждения: if (nAttributes & ATTRIB_HIGHLIGHT) then SayHighlightedText(hwnd, buffer) Первая из двух строк является знаменитым поразрядным If-Then утверждением, о котором мы говорили в разделе о поразрядных операторах. Если обнаружится, что это утверждение истинно, мы знаем, что текст является выделенным и обработка передается в следующую строку, которая является вызовом функции SayHighlightedText. Эта функция обрабатывает озвучивание всего нового выделенного текста. Если поразрядное If-Then утверждение является ложным, функция SayHighlightedText не вызывается а вместо этого выполняются следующие строки. Там находится: else SayNonHighlightedText(hwnd, buffer) Другими словами, если текст выделен цветом, вызываем функцию SayHighlightedText. В противном случае вызываем функцию SayNonHighlightedText. Вы, вероятно, уже догадались, что функция SayNonHighlightedText вызывается, чтобы обрабатывать озвучивание текста, не выделенного цветом. Так что же происходит, если скрипт решил, что текст ассоциирован с каким-либо фреймом? В этом случае обработка функций перескочит к следующей строке: if (nEcho == ECHO_NONE) then Эта строка сравнивает значение параметра nEcho с константой ECHO_NONE. Если выяснится, что они равны, это означает, что эхо фрейма установлено в значении"Нет", и ничего говорить не надо. В этом случае выполняется простой возврат (Return), ничего не озвучивается и все дела. Если это утверждение If-Then возвращает False, эхо не установлено в значение "Нет" и необходимо проделать еще кое-какую работу. Тогда необходимо обработать следующую строку: if (nEcho == ECHO_ALL || (nAttributes & ATTRIB_HIGHLIGHT)) then Первая часть этого If-Then утверждения спрашивает, является ли nEcho равным Echo_All. Другими словами, не установлено ли эхо фрейма в значение "Озвучивать весь текст"? Вторая часть утверждения If-Then является нашей старой доброй поразрядной операцией, которая определяет, является ли текст выделенным цветом. Если оба эти утверждения оказываются верными (вспомните, что оператор || является оператором Или), то выполняется следующая строка функции. В этой строке написано: SayString(buffer) Это утверждение просто озвучивает содержимое переменной Buffer, которое является текстом, написанным на экране. Если для фрейма не было задано озвучивать все, или текст не выделен цветом, функция завершит работу, вообще ничего не озвучивая. Боже, какая сложная работа! Всю эту обработку Jaws выполняет автоматически в мгновение ока, всякий раз, когда на экране появляется новый текст. Это великолепный пример того, как Jaws отслеживает все, что пишется на экране и решает, что вам нужно услышать. Эта функция воплощает многие аспекты языка скриптов Jaws, о которых мы говорили, и вы должны внимательно ее изучать, пока не поймете, как она работает. Если вы это поймете, вы будете на пути к тому, чтобы стать знатоком языка скриптов и сможете создавать свои собственные, продвинутые скрипты. Список событийных функцийДалее приведен список специальных функций, запускаемых системными событиями. Если вы хотите использовать эти функции для создания собственных скриптов, вы должны использовать имя в точности так, как написано здесь, и задавать все предписанные переменные в вызове функции в предписанном порядке. Более подробную информацию об этих функциях можно найти в файле BUILTIN.JSD. Обратите внимание, что этот список был обновлен, чтобы включить функции событий из версии 3.3. Если вы пользуетесь более ранней версией, у вас не будет всех элементов, которые перечислены ниже. AutoStartEvent - запускается, когда файл скриптов, содержащий эту функцию, загружается или получает фокус.
AutoFinishEvent - запускается, когда файл скриптов, содержащий эту функцию, закрывается или теряет фокус.
ItemNotFoundEvent - запускается, когда запрошенный элемент не был найден в модели Off-Screen.
NewTextEvent - запускается, если где-то на экране появляется новый текст.
TopEdgeEvent - запускается, когда активный курсор доходит до верхней границы окна.
BottomEdgeEvent - запускается, когда активный курсор доходит до нижней границы окна.
FocusChangedEvent - запускается, когда перемещается фокус ввода.
MenuModeEvent - запускается, когда фокус ввода попадает в меню.
CursorChangedEvent - запускается, когда изменяется форма указателя мыши (Jaws курсор).
WindowCreatedEvent - запускается, когда появляется новое окно.
WindowDestroyedEvent - запускается, когда окно исчезает.
WindowMinMaxEvent - запускается, когда изменяется статус окна свернуть/распахнуть.
WindowResizedEvent - запускается, когда окно близко к тому, чтобы изменить свой размер.
AppWillNotSpeakEvent - эта функция событий используется только при инсталляции Jaws и не предназначена для общих задач создания скриптов. KeyPressedEvent - запускается любым нажатием клавиш, за которыми закреплен скрипт, прежде чем отрабатывает этот скрипт.
MouseMovedEvent - запускается при перемещении мыши.
FocusPointMovedEvent - вызывается всякий раз, когда PC курсор перемещается в другое место на экране.
ActiveItemChangedEvent - запускается, когда изменяется активный элемент в объекте
CursorShapeChangedEvent - это событие происходит, когда изменяется форма указателя мыши.
TooltipEvent - это событие вызывается если JCF опция OPT_PROCESSTOOLTIPEVENT установлена в значении 1 или On. Она также вызывается автоматическим маркировщиком графики. Это событие отрабатывает всякий раз, когда появляется совет на панели инструментов. В данный момент используется только для хранения текста последнего совета в глобальной переменной типа String strLastTooltip.
ScreenMagnifiedEvent - функция события, которая запускается всякий раз,: когда активизируется увеличение экрана, деактивизируется или уровень увеличения изменяется (используется Magic).
FocusChangedMagEvent - эта функция запускается, когда фокус перемещается от одного элемента управления к другому.
ActiveItemChangedMagEvent - эта функция событий вызывается, когда выбранный элемент в списке или в дереве меняется, чтобы обрабатывать все специфические функции Magic, которые должны иметь место, когда выбранный элемент изменяется (используется Magic) FocusPointMovedMagEvent - эта функция вызывается FocusPointMovedEvent чтобы обрабатывать специфические функции Magic, которые должны иметь место, когда указатель фокуса изменяется.
NewTextMagEvent - функция, предназначенная для обработки, которая специфична для отслеживания Magic, когда на экране появляется новый текст. (используется Magic).
MenuModeMagEvent - это событие срабатывает, когда статус меню изменяется (используется Magic).
Техника создания скриптовИзучаем приложение с помощью функций утилитПрежде чем писать файл скриптов, мы должны иметь некоторое представление о том, что мы хотим выполнить с его помощью. Нам также часто необходимо познакомиться с окнами в нашем приложении, чтобы посмотреть, что имеется на экране и как это можно озвучить. Нам также может понадобиться подробная информация об окнах, такая, как класс, контрольный идентификатор и дескриптор (Handle), а также отношения родители-дети. В файле скриптов по умолчанию есть набор скриптов, которые называются скрипты утилит, которые могут сослужить здесь хорошую службу. Эти утилиты помогают создавать скрипты тем, что позволяют пользователю познакомиться с взаимоотношениями типа родители-дети для различных окон в приложении и предоставляют подробную информацию о каждом окне, такую, как класс, контрольный идентификатор и т.д. Каждая из утилит описана ниже вместе с закрепленной за ней комбинацией клавиш. Все эти утилиты используются в режиме Home Row (Insert+Пробел). Режим Home Row представляет собой смещенное состояние клавиатуры, несколько напоминающее смещенное состояние, которое можно получить с помощью клавиш CapsLock и NumLock. Это означает, что вы получаете доступ к каждой функции с помощью указанной комбинации клавиш, после того, как вы включили режим Home Row путем одновременного нажатия клавиш Insert и Пробел. Чтобы выйти из режима, нажмите Insert+Пробел еще раз.
Использование этих утилит поможет вам собрать всю информацию, которая может вам понадобиться, относительно элементов управления, отношениях родители/дети, и атрибуты текста, чтобы использовать эту информацию в своих собственных скриптах. Домашнее задание # 7Откройте приложение WordPad. Затем включите режим Home Row. Используя F1 и F3 получите всю необходимую информацию о параметрах главного окна редактирования и поля редактирования имени файла в диалоге открытия файла. Получение информации об окне с помощью скрипта ScreenSensitiveHelpTechnicalЕсли вам нужно быстро прочитать контрольный идентификатор окна, класс или дескриптор, то вам поможет скрипт ScreenSensitiveHelpTechnical в файле скриптов по умолчанию. Доступ к этому скрипту можно получить с помощью комбинации клавиш Ctrl+Insert+ F1, и будет озвучен контрольный идентификатор, класс и дескриптор окна, содержащего активный курсор. Это самый быстрый способ получить эту информацию, если вам не нужны все другие данные, предоставляемые скриптами утилит. Типы файлов скриптовКак уже было сказано выше, существует несколько типов файлов, ассоциированных с написанием скриптов. Тип файла можно узнать по его расширению.
Исходные файлыисходный код для файлов скриптов имеет очень свободную форму. Вы можете вставлять пробелы или пустые строки везде, где только захотите. Заглавные буквы не требуются, и игнорируются компилятором, за исключением определенных функций сравнения строк, таких как StringContains (). Надо сказать, что имеются некоторые соображения по поводу форматирования. Хотя ваш код может быть лично вам абсолютно понятен, другие могут вообще ничего в нем не понять, поскольку они не знали, что вы имели в виду и их работа, возможно, элементизована не так, как у вас. Поэтому мы хотели бы порекомендовать несколько правил правой руки, которые облегчат другим понимание вашего кода и помогут вам понять скрипты, написанные другими.
Скомпилированные файлыКогда вы закончите писать свой код (а этого не случится никогда, поэтому когда вы устанете писать свой код), его нужно скомпилировать, чтобы Jaws мог его использовать. Вашему файлу будет присвоено то же имя, что и у приложения, и расширение .JSB, когда вы его скомпилируете, так что Jaws будет знать, когда его загружать. Процесс компиляции автоматически выполняется диспетчером скриптов, когда вы выбираете Save (Сохранить) из меню Файл. Исходный файл с расширением .JSS сохраняется, и в это же время создается и сохраняется файл с расширением .JSB. Эта компиляция включает все файлы заголовков и сообщений, которые были включены соответствующими утверждениями в начале .JSS файла. Include файлыКак мы уже говорили прежде, компилятор скриптов Jaws обеспечивает включение других файлов в наш файл скриптов во время компиляции. Когда компиляция будет завершена, все, что было во включенных файлах, стало частью .JSB файла и будет доступно всякий раз, когда файл скриптов будет активным. Есть два типа файлов включения: Файлы заголовков обозначаются расширением .JSH и содержат или операторы переменных, или операторы констант. Файлы сообщений обозначаются расширением .JSM и содержат сообщения вместе с присвоенными им номерами. Всегда группируйте свои утверждения включения где-нибудь поближе к началу файла скриптов. Помещение глобальных переменных и констант в отдельный файл заголовков, а сообщений в отдельный файл сообщений помогает лучше элементизовать работу. С Jaws поставляются два файла, которые предоставляют все стандартные глобальные переменные и константы. Они называются HJGLOBAL.JSH и HJCONST.JSH. Они сделаны с таким расчетом, чтобы разработчики могли использовать любую стандартную переменную или константу, просто включив их в свои собственные файлы скриптов. Файлы сообщений также сделаны в виде файлов включения. Стандартным файлом сообщений является DEFAULT.JSM. Использовать файлы сообщений в ваших скриптах необязательно. Henter-Joyce поместил сообщения в отдельном файле для более простого перевода на другие языки. Если вы намерены писать скрипты для общего пользования, было бы неплохо соблюдать это соглашение. Если вы все же используете файл сообщений, он должен быть назван также, как4 и файл скриптов, чтобы вы могли легко его найти. |
|||||||||
Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения. Идея и реализация: © Владимир Довыденков и Анатолий Камынин, 2004-2024 |
Социальные сети