Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Функции ввода для консольных устройств




 

Как ни странно, ввод текстовых строк для пользователей системных функций организуется проще, чем ввод отдельных символов. В ОС Windows для консольного ввода строк текста с клавиатуры предназначена функция ReadConsoleA с прототипом

BOOL ReadConsoleA(HANDLE hConsInput, VOID* buffer, DWORD len,

DWORD actlen, VOID* reserved);

Первый параметр этой функции задает хэндл буфера ввода с консоли. Он и в простейших (и в большинстве) случаев получается в результате вызова функции GetStdHandle с аргументом STD_INPUT_HANDLE. Параметр buffer задает буфер для ввода текстовой строки, а параметр len определяет максимальный размер вводимой строки (обычно этот параметр совпадает с длиной буфера buffer). Параметр actlen используется для получения числа, сообщающего сколько символов было введено в ходе выполнения функции. (В число символов входит и завершающий символ ‘\n’). Последний параметр reserved вызова функции зарезервирован разработчиками и должен использоваться равным NULL.

В следующем примере демонстрируется использование рассмотренной функции

#include <windows.h>

#include <string.h>

#include <stdio.h>

void main()

{char prompt[]="Input any text string:\n";

char text[120]="\nInputing string:\n";

char buffer[80];

DWORD actlen;

HANDLE hstdout,hstdin;

hstdout=GetStdHandle(STD_OUTPUT_HANDLE);

if(hstdout==INVALID_HANDLE_VALUE)

{printf("Error GetStdHandle\n");exit(-1);}

hstdin=GetStdHandle(STD_INPUT_HANDLE);

if(hstdin==INVALID_HANDLE_VALUE)

{printf("Error GetStdHandle\n");exit(-1);}

WriteConsoleA(hstdout,prompt,sizeof(prompt),&actlen,NULL);

ReadConsoleA(hstdin,buffer,80,&actlen,NULL);

buffer[actlen]='\0';

strcat(text,buffer);

WriteConsoleA(hstdout,text,strlen(text),&actlen,NULL);

getchar();

CloseHandle(hstdout);

ExitProcess(0);

}

Простейшей функцией ввода с консоли является ввод одиночного символа. В ОС Windows ввод символов даже для консоли организован довольно сложно, но в такой сложной организации скрыты дополнительные возможности системы с многооконным интерфейсом. Информация, поступающая извне в программу, рассматривается ОС как событие (event), причем детализация события для программы обеспечивается использованием сообщений. Сообщение в системе с многооконным интерфейсом – это стандартная для ОС структура данных. (По существу очень схожая с принятой в конкретной стране формой управленческих писем, которые кроме содержания содержат указания: откуда поступило письмо, что в нем содержится, время его отправки и т.п.). Сообщения могут поступать не только от клавиатуры, но и от мыши. Кроме того, приложению могут потребоваться сообщения от операционной системы, например, о изменении размера консольного окна. Поэтому структура данных для событии стандартизована в Windows с помощью следующих описаний. Основной структурой служит запись сообщения о вводе, она имеет вид

Typedef struct _INPUT_RECORD

{ WORD EventType;

Union

{ KEY_EVENT_RECORD KeyEvent;

MOUSE_EVENT_RECORD MouseEvent;

WINDOW_BUFFER_SIZE_RECORD MenuEvent;

FOCUS_EVENT_RECORD FocusEvent;

} Event;

} INPUT_RECORD, *PINPUT_RECORD;

Ключевым полем в этой структуре является тип события EventType, его значения задаются предопределенными символическими константами KEY_EVENT, MOUSE_EVENT, WINDOW_BUFFER_SIZE_EVENT, EVENT, FOCUS_EVENT. В данном разделе нас интересуют символа, вводимые с клавиатуры, и, следовательно, ключевой флаг KEY_EVENT. Когда имеет место это значение типа события, то комбинированный компонент (unit) записи сообщения имеет тип KEY_EVENT_RECORD и содержит структуру данных с именем KeyEvent. В свою очередь, структура данных KEY_EVENT_RECORD для записи ввода с клавиатуры описана в заголовочном файле как





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


Дата добавления: 2016-12-06; Мы поможем в написании ваших работ!; просмотров: 599 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Лучшая месть – огромный успех. © Фрэнк Синатра
==> читать все изречения...

2268 - | 2155 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.007 с.