Título: Lendo teclas de função
Linguagem: C/C++
S.O.: DOS
Autor(es): Wenderson Teixeira
Muitas vezes me perguntam como ler uma tecla de função (F1..F12), setas ou as teclas de edição (Insert, Home, PageUp, PageDown, Delete, End), para evitar responder a essa questão mais uma vez, resolvi colocá-la aqui.
No DOS, quando queremos ler uma tecla, utilizamos as funções getch ou getche, estas funções lêem uma tecla e retornam seu valor, para teclas normais, o valor retornado é equivalente ao caracter correspondente a tecla, ou seja, se pressionarmos a tecla 'A', será retornado o código 'A' que equivale a 65, e assim por diante. Mas o que acontece quando pressionamos uma tecla de função? Bem, aí a história muda um pouco, quando pressionamos uma tecla especial, é retornado o valor 0 (zero), você deve então fazer a leitura novamente, será retornado então um valor de 1 a 255, correspondente ao código da tecla.
Para tornar mais compreensível, criei duas funções, ReadKeyWait e ReadKey para fazer a leitura de teclas, incluindo as especiais, a primeira espera que seja digitado uma tecla, só retornado depois de lida, a segunda, verifica se alguma tecla já foi pressionada, se sim, a mesma é retornada, caso contrário retorna 0, para teclas normais o código retornado vai de 1 à 255, as teclas especiais são sempre maiores ou iguais a 256. Foram criadas constantes com os valores definidos para facilitar a utilização e um programa exemplo também foi criado para demonstração.
ReadKey.h
ReadKey.cpp
Teste.c
#ifndef _READKEY_H
#define _READKEY_H
#define BKSPC 0x08
#define TAB 0x09
#define LF 0x0A
#define CR 0x0D
#define ESC 0x1B
#define F1 0x3B00
#define F2 0x3C00
#define F3 0x3D00
#define F4 0x3E00
#define F5 0x3F00
#define F6 0x4000
#define F7 0x4100
#define F8 0x4200
#define F9 0x4300
#define F10 0x4400
#define F11 0x8500
#define F12 0x8600
#define UP 0x4800
#define LEFT 0x4B00
#define RIGHT 0x4D00
#define DOWN 0x5000
#define HOME 0x4700
#define END 0x4F00
#define PAGEUP 0x4900
#define PAGEDN 0x5100
#define INSERT 0x5200
#define DELETE 0x5300
#ifdef __cplusplus
extern "C" {
#endif
int ReadKeyWait(void);
int ReadKey(void);
#ifdef __cplusplus
}
#endif
#endif
#include <conio.h>
int ReadKeyWait(void)
{
int ch = getch();
return ch ? ch : getch() << 8;
}
int ReadKey(void)
{
return kbhit() ? ReadKeyWait() : 0;
}
#include <stdio.h>
#include "ReadKey.h"
void main()
{
unsigned Key;
printf("Digite uma tecla para ver seu valor, ESC p/ Sair\n\n");
do
{
Key = ReadKey();
if(Key)
{
switch(Key)
{
case UP: printf("Up");
break;
case LEFT: printf("Left");
break;
case RIGHT: printf("Right");
break;
case DOWN: printf("Down");
break;
default:
printf("%s - %3ud %02Xh\t %c\n",
(Key > 255 ? "ctrl" : "char"),
Key, Key, (Key > 256 ? Key >> 8 : Key));
}
}
} while (Key != ESC);
}