ФУНКЦИИ ВВОДА ДЛЯ КОНСОЛЬНЫХ УСТРОЙСТВ

 

Как ни странно, ввод текстовых строк для пользователей системных функций организуется проще, чем ввод отдельных символов. В ОС 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 для записи ввода с клавиатуры описана в заголовочном файле как