2.6. Клавиатурные функции библиотеки Microsoft c
Стандартные библиотеки трансляторов Microsoft QuickC и C 6.0 содержат набор функций, предназначенных для работы с клавиатурой. Эти функции повторяют и немного дополняют возможности функций MS-DOS и BIOS, обслуживающих клавиатуру.
Самые простые из них - getch() и getche(). Они описаны в файле conio.h.
Функция getch() имеет следующий прототип:
int getch(void);
Эта функция возвращает ASCII-код прочитанного из клавиатурного буфера символа, причем прочитанный символ не отображается на экране. Если была нажата функциональная клавиша или клавиша перемещения курсора, функция возвращает 0. В этом случае функцию надо вызвать еще раз для получения расширенного ASCII-кода нажатой клавиши.
Функция обрабатывает клавиши Ctrl-С и Ctrl-Break - при вводе этих комбинаций клавиш работа программы завершается.
Если клавиатурный буфер пуст, программа переводится в состояние ожидания.
Функция getche() полностью аналогична функции getch(), за исключением того, что прочитанный символ отображается на экране. Приведем прототип функции getche():
int getche(void);
Приведем пример программы, отображающей на экране ASCII-коды и расширенные ASCII-коды нажимаемых клавиш:
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
void main() {
int key;
// Читаем в цикле символы с клавиатуры и отображаем
// ASCII-коды нажатых клавиш.
// Выходим из цикла при нажатии не клавишу ESC
for(;;) {
// Читаем символ
key = getch();
// Если прочитанный символ равен 0, вызываем функцию getch()
// для получения расширенного ASCII-кода нажатой клавиши
if( (key == 0) || (key == 0xe0) ) {
key = getch();
printf( "Расширенный ASCII-код:t" );
}
else printf( "ASCII-код:t");
printf("%dn",key);
// При нажатии на клавишу ESC выходим из цикла
if( key == 27) break;
}
}
Для проверки буфера клавиатуры на наличие символов можно использовать функцию kbhit(). Она также описана в файле conio.h:
int kbhit(void);
Если буфер клавиатуры не пуст, функция возвращает ненулевое значение. В этом случае программа может прочитать символы из буфера клавиатуры при помощи фукнкций getch() и getche(). Если буфер клавиатуры пуст, функция возвращает нулевое значение.
Приведем пример программы, ожидающей нажатия на любую клавишу. Во время ожидания программа выводит на экран поочередно символы "<" и ">":
#include <conio.h>
void main() {
int key;
// Ожидаем нажатия на любую клавишу.
// Во время ожидания выводим на экран поочередно
// символы "<" и ">"
while(!kbhit()) printf("<b>b");
// Как только будет нажата какая-нибудь клавиша,
// выводим ее ASCII-код
key = getch();
// Если прочитанный символ равен 0, вызываем функцию getch()
// для получения расширенного ASCII-кода нажатой клавиши
if( (key == 0) || (key == 0xe0) ) {
key = getch();
printf( "Расширенный ASCII-код:t" );
}
else printf( "ASCII-код:t");
printf("%dn",key);
}
Для ввода с клавиатуры строки символов можно использовать функцию cgets(), работающую аналогично функции 0Ah прерывания MS-DOS INT 21h:
char *cgets(char *buffer);
Функция описана в файле conio.h.
Перед вызовом аргумент функции buffer должен указывать на массив, размер которого должен быть достаточным для хранения вводимой строки, завершающего строку нулевого байта и двух дополнительных байтов. Первый элемент массива buffer[0] должен содержать максимальную длину вводимой строки - как и для функции 0Ah прерывания MS-DOS INT 21h.
После завершения ввода второй элемент массива buffer[1] будет содержать длину введенной строки, сама строка будет завершаться символами новой строки NL, перевода строки LF и нулем.
Функция cgets() возвращает указатель на начало введенной строки в буфере, т.е. на третий элемент массива buffer[2].
Приведем простой пример, в котором функция cgets() используется для ввода целого числа:
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX 80
char buf[MAX];
void main() {
int i;
char *bufptr;
// Устанавливаем максимально допустимую длину строки
buf[0] = MAX + 2;
printf("nВведите целое число: ");
// Вводим число, можно использовать клавиши редактирования
bufptr = cgets(buf);
// Преобразуем введенное число к формату int
// и выводим его
i = atoi(bufptr);
printf("nВы ввели число %d", i);
}
Существует и более удобная для использования функция, позволяющая вводить строку с клавиатуры, а точнее, из стандартного потока ввода. Это функция gets():
char *gets(char *buffer);
Функция gets() описана в файле stdio.h.
Эта функция читает строку из стандартного потока ввода stdin и запоминает ее в буфере buffer. Символ новой строки n в конце введенной строки функция заменяет на ноль.
После завершения ввода функция возвращает указатель на заполненный буфер или NULL в случае ошибки или условия "Конец файла".
Обратим ваше внимание на отличия между функциями cgets() и gets():
Функция cgets() позволяет редактировать вводимую строку символов, функция gets() просто записывает в буфер все символы подряд (в том числе и коды клавиш редактирования).
Программе, использующей для ввода с клавиатуры функцию cgets(), недоступны средства переназначения ввода операционной системы. Если же программа использует функцию gets(), которая читает строку из стандартного потока ввода, можно использовать средства переназначения.
Перед вызовом функции cgets() необходимо специальным образом подготовить буфер для вводимой строки (записать в первый байт буфера длину вводимой строки). Функция gets() не требует никакой подготовки буфера.
Еще одна полезная функция, которую можно использовать для ввода с клавиатуры - scanf(). Эта функция подробно описана во всех книгах по языку программирования Си, поэтому мы не будем ее подробно рассматривать. Отметим только, что с помощью этой функции можно организовать ввод чисел в заданном формате. Однако можно сначала ввести строку при помощи функций cgets() или gets(), а уже потом выполнять все необходимые проверки и преобразования этой строки.
- Клавиатура
- 2.1. Принципы работы клавиатуры
- 2.2. Порты для работы с клавиатурой
- 2.3. Аппаратное прерывание клавиатуры
- 2.4. Средства bios для работы с клавиатурой
- 2.4.1. Чтение символа с ожиданием
- 2.4.2. Проверка буфера на наличие в нем символов
- 2.4.3. Получение состояния переключающих клавиш
- 2.4.4. Установка временных характеристик клавиатуры
- 2.4.5. Запись символов в буфер клавиатуры
- 2.4.6 Чтение символа с ожиданием для 101-клавишной клавиатуры
- 2.4.7. Проверка буфера на наличие в нем символов для 101-клавишной клавиатуры
- 2.4.8. Получение состояния переключающих клавиш для 101-клавишной клавиатуры
- 2.5. Средства ms-dos для работы с клавиатурой
- 2.5.1. Буферизованный ввод с эхо-выводом
- 2.5.2. Буферизованный ввод без эхо-вывода
- 2.5.3. Нефильтрованный ввод без эхо-вывода
- 2.5.4. Ввод/вывод на консоль
- 2.5.5. Ввод строки символов
- 2.5.6. Проверка состояния стандартного ввода
- 2.5.7. Сброс буфера клавиатуры
- 2.6. Клавиатурные функции библиотеки Microsoft c
- 2.6. Драйвера режима ядра для ps/2 клавиатуры Стек драйверов для системных устройств ввода
- Стек драйверов для Plug and Play ps/2-клавиатуры
- Стек устройств для Plug and Play ps/2-клавиатуры
- Обработка клавиатурного ввода приложениями Поток необработанного ввода (получение данных от драйвера)
- Обработка сообщений конкретным окном
- Массивы состояния клавиш клавиатуры
- Клавиатурные ловушки
- Общая схема обработки
- Модель прямого ввода (Raw Input)