Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Ввод данных, размещенных предварительно на экране




Для чтения в OS/2 текстовой информации с экрана служат две функции: VioReadCharStr и VioReadCellStr.

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

Прототипы этих функций имеют вид

APIRET16 VioReadCharStr(PCH text, PUSHORT len, USHORT row,

USHORT col, HVIO hvio);

APIRET16 VioReadCellStr(PCH cells, PUSHORT len, USHORT row,

USHORT col, HVIO hvio);

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

 

В Windows для чтения информации с экрана имеется даже три функции. Это функция ReadConsoleOutputCharacter – для чтения с экрана только собственно символов текста, функция ReadConsoleOutputCharacter – для чтения с экрана символов текста вместе с их атрибутами и функция ReadConsoleOutputAttribute – для чтения из последовательных позиций экрана атрибутов символов. (Заметим, что в OS/2 нет аналога последней функции.) Перечисленные функции имеют следующие прототипы:

BOOL ReadConsoleOutputCharacter(HANDLE hConsOut,

STR* buffer, DWORD len, COORD dwReadCoord,

DWORD* actlen);

BOOL ReadConsoleOutput(HANDLE hConsOut,

CHAR_INFO* cells, COORD dwBufferSize,

COORD dwBufferCoord, SMALL_RECT* rect);

BOOL ReadConsoleOutputAttribute(HANDLE hConsOut,

WORD* attribs, DWORD len, COORD pos,

DWORD* actlen).

Вторая из перечисленных функций является обратной к функции с именем WriteConsoleOutput, которая в свою очередь предназначена для размещения на экране информации из двухмерного массива элементов, состоящих из пары (символ, его атрибут). Практически все параметры этих функций совпадают по использованным здесь обозначениям, по их типам и назначению. Вся разница между этими функциями в том, что одна из них переносит информацию из указанного в них прямоугольника экрана в двухмерный массив данных (функция ReadConsoleOutput), а другая осуществляет перенос информации в противо­по­лож­ном направлении: из двухмерного массива элементов – в указанный прямоугольник экрана. В обоих случаях параметр rect определяет используемый в описании прямоугольник экрана; параметр cells – массив элементов (ячеек для пар символ-атрибут); параметр dwBufferSize – как размеры массива, а dwBufferCoord – позицию (индекс строки и столбца) того элемента массива, начиная с которого используется массив в конкретном вызове рассматриваемых функций.

Функция ReadConsoleOutputCharacter выполняет чтение только символов в буфер программы с именем buffer (или по адресу, который дает указатель buffer – в зависимости как конкретно определено это имя), а функция ReadConsole­Output­Attribute выполняет чтение только атрибутов в массив слов, указанный параметром attribs. Число читаемых при этом символов или атрибутов задается параметром len, чтение выполняется с начальной позиции экрана, задаваемой параметром с именем pos, а действительное число прочитанных символов или атрибутов возвращается с помощью параметра actlen.

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

В то же время современные версии Unix, в частности Linux, ориентируясь на возможности современных электронных устройств вывода информации пользователю, предлагают дополнительные виртуальные устройства. Одним из таких устройств является "виртуальный экран консоли", обозначаемый в файловой системе Unix как vcs (сокращение от virtual consoe screen). В связи с замечательными особенностями файловой системы Unix устройства в ней рассматриваются как файлы, только специализированные. Это позволяет использовать операцию открытия файлов для доступа к устройствам. Заметим, что специальные файлы устройств стандартным образом размещаются в каталоге /dev, поэтому полное наименование устройства виртуального экрана консоли следует задавать в виде /dev/vcs.

Практически в настоящее время имеется целый набор виртуальных экранов консолей на весь их возможный набор. Когда желательно иметь непосредственный доступ к виртуальному экрану для текущей консоли, с которой работает программа или оператор, рекомендуется использовать виртуальное устройство, обозначаемое как vcs. Это виртуальное устройство, рассматриваемое как файл, отображает содержимое видеопамяти для экрана данной виртуальной консоли. Каждой позиции экрана в этом файле соответствует один байт. Поэтому при использовании типового разрешения экрана в 25 строк по 80 символов виртуальный экран консоли vcs хранится как файл из 2000 байтов (25x80).

Кроме виртуального экрана консоли vcs, можно использовать расширенное виртуальное устройство, обозначаемое как vcsa, которое позволяет считывать из видеопамяти не только коды символов, но и их атрибуты. На каждую позицию экрана в этом файле имеются два байта: один хранит код самого символа, а второй (следующий) код атрибутов этого символа. Кроме того, в файле vcsa - в его начале размещаются четыре служебных байта, хранящие, соответственно, число строк экрана, число столбцов в нем, а далее номер столбца и номер строки, в которых находится курсор экрана. Поэтому при использовании типового разрешения экрана в 25 строк по 80 символов виртуальный экран консоли vcsa хранит как файл 4004 байтов (25x80x2+4).

Следующая программа, приведенная листингом 4.4.1, демонстрирует сохранение текущего содержимого экрана в файле с именем myscreen.

 

#include <stdio.h>

#include <fcntl.h>

void main()

{int screena, fhandle;

int rc;

char buffer[256];

 

screena=open("/dev/vcs",O_RDONLY);

if (screena= =-1) {printf("Error open virtual screen\n"); exit(0);}

fhandle=open("myscreen",O_WRONLY|O_CREAT, 0600);

while ((rc=read(screena,buffer,256))!=0)

{write(fhandle, buffer,rc);}

close(screena);

close(fhandle);

}

Листинг 4.4.1. Чтение из виртуального устройства экрана

 

Использование виртуального экрана консоли, как файла, из которого можно оперативно извлекать содержимое любой позиции экрана, позволяет решать те же задачи, что и функции прямого чтения видеобуфера, применяющиеся в Windows.

Следует только заметить, что для непривилегированных пользователей Linux устройство vcs может оказаться недоступным по чтению, если об этом не побеспокоиться на уровне общесистемных установок. (При недоступном устройстве возвращается ошибка открытия файла.) Чтобы сделать это устройство доступным по чтению любым пользователям следует в режиме привилегированного пользователя (обычно пользователя с именем root) выполнить команду

chmod o+r /dev/vcs

Проверить результат можно с помощью команды Unix, которую следует задать в виде

ls -l /dev/vcs

Она должна выдать сообщение вида

crw----r-- 1 root tty номер, номер дата /dev/vcs

(Вместо дефисов здесь могут быть (хотя и маловероятно) какие-то другие символы.)

Аналогичное действие следует выполнить и над устройством vcsa, если предполагается использовать последнее.

 




Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 470; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.019 сек.