sexta-feira, 3 de outubro de 2008

Código em C para ler código de tecla pressionada

As funções getch() e kbhit() da biblioteca CONIO proporcionam funcionalidades para monitoramento de teclas pressionadas, permitindo obter o código da tecla sem precisar aguardar que o usuário pressione ENTER, como ocorre com a getchar() padrão.

 

//---------------------------------------------------------------------------

#pragma hdrstop

#include <stdio.h>      // printf

#include <conio.h>      // kbhit, getch

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    int keycode, normalkey;

    while ( keycode != 27 )         // ESCAPE
    {


        // aguardar uma tecla ser pressionada
        while ( ! kbhit() ) ;

        // ler o código da tecla pressionada
        keycode = getch();

        // keycode = 0 se for tecla especial
        normalkey = keycode;

        // se tecla especial,
        // pegar o próximo código para identificar a tecla pressionada
        if ( !normalkey )
            keycode = getch();

        if      ( normalkey && keycode >= 48 && keycode <= 57 )
            printf("\nteclou digito %c = %d = valor decimal %d",
                    keycode, keycode, (keycode - 48) );

        else if ( normalkey && keycode >= 65 && keycode <= 90 )
            printf("\nteclou letra maiuscula %c = %d",
                    keycode, keycode);

        else if ( normalkey && keycode >= 97 && keycode <= 122 )
            printf("\nteclou letra minuscula %c = %d",
                    keycode, keycode);

        else if ( !normalkey && keycode >= 59 && keycode <= 68 )
            printf("\nteclou F%1d = %d",
                    (keycode - 58), keycode);

        else if ( !normalkey && keycode >= 133 && keycode <= 134 )
            printf("\nteclou F%2d = %d",
                    (keycode - 122), keycode);

        else if ( normalkey && keycode == 27 )
            printf("\nteclou ESCAPE = %d", keycode);

        else if ( normalkey && keycode == 8 )
            printf("\nteclou BACKSPACE = %d", keycode);

        else if ( normalkey && keycode == 9 )
            printf("\nteclou TAB = %d", keycode);

        else if ( normalkey && keycode == 13 )
            printf("\nteclou CARRIAGE-RETURN (ENTER) = %d", keycode);

        else if ( normalkey && keycode == 10 )
            printf("\nteclou LINE-FEED (CTRL-ENTER) = %d", keycode);

        else if ( !normalkey && keycode == 75 )
            printf("\nteclou SETA A ESQUERDA = %d", keycode);

        else if ( !normalkey && keycode == 77 )
            printf("\nteclou SETA A DIREITA = %d", keycode);

        else if ( !normalkey && keycode == 72 )
            printf("\nteclou SETA PARA CIMA = %d", keycode);

        else if ( !normalkey && keycode == 80 )
            printf("\nteclou SETA PARA BAIXO = %d", keycode);

        else if ( !normalkey && keycode >= 82 && keycode <= 83 )
            printf("\nteclou %s = %d",
                    (keycode == 82 ? "INSERT\0" : "DELETE\0"), keycode);

        else if ( !normalkey && keycode == 71 )
            printf("\nteclou HOME = %d", keycode);

        else if ( !normalkey && keycode == 79 )
            printf("\nteclou END = %d", keycode);

        else if ( !normalkey && keycode == 73 )
            printf("\nteclou PAGE-UP = %d", keycode);

        else if ( !normalkey && keycode == 81 )
            printf("\nteclou PAGE-DOWN = %d", keycode);

        else
            printf("\nteclou %c = %d (%s)",
                    keycode, keycode, (normalkey ? "normal\0" : "especial\0") );
    }

    return 0;
}
//---------------------------------------------------------------------------

 

Com o código acima, espero ter apresentado dicas para os exercícios propostos em sala de aula.

 

Bom estudo e até a próxima.

3 comentários:

Anônimo disse...

Eae blz
queria saber pra que serve

" #pragma hdrstop"
" #pragma argsused "

e pq "int main(int argc, char* argv[])"

mais especificamente o do pq desses argumentos "(int argc, char* argv[])" e pra que serve.

OBrigado

Anônimo disse...

Alias gostei muito deste post bem intuitivo e facil de entender!

Josimar Nunes de Oliveira disse...

Questão#1 - 'pragma' diretiva ao compilador

#pragma hdrstop

Diretiva para instruir o compilador a parar de gerar arquivos PCH (pre compiled headers).

fontes:

https://computing.llnl.gov/tutorials/linux_clusters/man/icc.txt
http://msdn.microsoft.com/en-us/library/d9x1s805.aspx
http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3000323
http://ps-2.kev009.com/rs6000/docs/visualage/pragmas.pdf

#pragma argsused

1. Em uma linha precedente a uma função, como no exemplo a seguir:

#pragma argsused
int Max10(N,a,b,c,d,e,f,g,h,i)
...
alerta o compilador que a função irá usar todos os seus argumentos, mesmo que eles não sejam necessariamente usados (referenciados).

fonte:

http://www.thinkage.ca/english/gcos/expl/lint/manu/manu.html#PragmaArgsused

2. Para o Borland C++, define-se o seguinte:

O "pragma argsused" é válido somente para a próxima função declarada e serve para desativar o aviso:

" Parameter name is never used in function 'function-name' "

fonte:
http://bitsavers.trailing-edge.com/pdf/borland/borland_C++/Borland_C++_Version_3.1_Programmers_Guide_1992.pdf

Questão #2 - Protótipo da função 'main'

int main(int argc, char* argv[]);

Os argumentos são:

int argc : contador de argumentos recebidos
char *argv[] : arranjo de strings as quais representam os argumentos recebidos

Quando se executa um programa, podemos inserir dados na linha de comando do shell ou interface de linha de comando ( cmd.exe, p.exemplo ), como a seguir:

C:\programa.exe São Paulo 04 de setembro de 2014

O programa irá receber:

int argc : 8 argumentos
char *argv[0] : C:\programa.exe
char *argv[1] : São
char *argv[2] : Paulo
char *argv[3] : 04
char *argv[4] : de
char *argv[5] : setembro
char *argv[6] : de
char *argv[7] : 2014

Também podemos construir um programa que execute um segundo programa de maneira automática, passando a este os argumentos necessários (mais informações em http://msdn.microsoft.com/en-us/library/20y988d2.aspx).