Ir ao conteúdo
  • Cadastre-se

[C/C++1 - win32] - como detectar o estado das teclas?


Cambalinho

Posts recomendados

eu fiz 1 funçao para verificar o estado das teclas(se estão pressionadas ou activas(como o scroll/num/caps lock)):

const int AnyKey=257;const int NoKey=256;const int ON=2;void GetKeyBoardKeyState(int *keys){    bool NoKey=true;    bool AnyKey =false;    for(int i=0; i<256; i++)    {        if(GetKeyState(i) & 0x8000)        {            keys[i]=1;            if((i==VK_CAPITAL) && ((GetKeyState(VK_CAPITAL) & 0x0001)!=0))                keys[i]=2;            if((i==VK_NUMLOCK) && ((GetKeyState(VK_NUMLOCK) & 0x0001)!=0))                keys[i]=2;            if((i==VK_SCROLL) && ((GetKeyState(VK_SCROLL) & 0x0001)!=0))                keys[i]=2;            NoKey=false;            AnyKey=true;        }        else        {            keys[i]=0;        }    }    if(NoKey==false)    {        keys[256]=0;    }    else    {        keys[256]=1;    }    if(AnyKey==true)    {        keys[257]=1;    }    else    {        keys[257]=0;    }}

esta funçao é chamada de 120 em 120 millisegundos num temporizador. mas tenho 1 problema: as teclas num/scroll/caps lock parecem só ser testadas 1 delas em vez das 3 :(

alguem me pode explicar onde esta a minha confusao?

Link para o comentário
Compartilhar em outros sites

 

Se definir o escopo dos if, muda algo?

Ou seja,

if(){}

Tenho a impressão de que o compilador esteja testando o segundo e o terceiro if a partir do primeiro:

if(){    if()    {         if()         {         }    }}

tambem o fiz e tirei os 'if's' do ciclo 'for'... mas mesmo assim estou com problemas :(

e o problema esta mesmo aqui:

if(((GetKeyState(VK_CAPITAL) & 0x0001)!=0))    {        keys[VK_CAPITAL]=2;    }    if(((GetKeyState(VK_NUMLOCK) & 0x0001)!=0))    {         keys[VK_NUMLOCK]=2;    }    if(((GetKeyState(VK_SCROLL) & 0x0001)!=0))    {        keys[VK_SCROLL]=2;    }

este codigo, é especifico para verificar se o num/scroll/caps estão activos ou n. aqui é que esta o erro, porque deve só verificar 1 deles :(

Link para o comentário
Compartilhar em outros sites

Ok.

Mais uma pergunta, na hora de usar o simbolo & você se refere a qual versão sobrecarregada, operador de comparação ou de endereço de memoria?

 

Ou seja,

&0x0001

Ou,

GetKeyState(VK_SCROLL) != 0 && 0x0001 != 0

Porque de fato a condição que você esta testando não faz sentido pra mim. Talvez pro compilador também. :P

Link para o comentário
Compartilhar em outros sites

Ok.

Mais uma pergunta, na hora de usar o simbolo & você se refere a qual versão sobrecarregada, operador de comparação ou de endereço de memoria?

 

Ou seja,

&0x0001

Ou,

GetKeyState(VK_SCROLL) != 0 && 0x0001 != 0

Porque de fato a condição que você esta testando não faz sentido pra mim. Talvez pro compilador também. :P

desculpa, mas nao resolveu o problema :(

outra coisa que testei e ainda nao te disse. vê estes 2 casos:

1 - clicas na num lock(ou outra tecla) varias vezes. notas que é activada ou desactivada(esta correcto);

2 - imagina que deixas a num lock activada e clicas noutra tecla qualquer, eu perco os valor de activado.

 

porque que isto acontece?

a mim o codigo parace-me correcto. talvez use mal a GetKeyState(), mas o codigo esta bem pensado.

Link para o comentário
Compartilhar em outros sites

Bom, você ainda não respondeu minha pergunta, hehe. Não era pra resolver o problema, ainda, mas sim entende-lo. Ainda preciso entender o queres dizer com

GetKeyState(VK_SCROLL) & 0x0001

Mas de qualquer maneira, vou colar ai abaixo a documentação da GetKeyState(). Da uma olhada na seção 'Return values unclear': http://msdn.microsoft.com/en-us/library/windows/desktop/ms646301%28v=vs.85%29.aspx

Link para o comentário
Compartilhar em outros sites

YES!!!!

agora funciona bem amigo:

const int AnyKey=257;const int NoKey=256;const int ON=2;void GetKeyBoardKeyState(int *keys){    Keys[AnyKey]=0;    Keys[NoKey]=1;    for(int i=0; i<258; i++)    {        //if a key isn't a lock activated(2)        //put it zero        keys[i]=0;        //if a key is pressed        if(GetKeyState(i) & 0x8000)        {            //if a key isn't a lock activated(2)            //put it 1            keys[i]=1;            //any key pressed            Keys[AnyKey]=1;            Keys[NoKey]=0;        }    }    //testing the lock activation    if(((GetKeyState(VK_CAPITAL) & 0x0001)!=0))        keys[VK_CAPITAL]=2;    if(((GetKeyState(VK_NUMLOCK) & 0x0001)!=0))        keys[VK_NUMLOCK]=2;    if(((GetKeyState(VK_SCROLL) & 0x0001)!=0))        keys[VK_SCROLL]=2;}

penso estar-me a enganar numa cena e na condiçao do 'for':

const int AnyKey=257;const int NoKey=256;for(int i=0; i<258; i++)

como ves o AnyKey é 257 e depois no 'for'. mas penso estar correcto, certo?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...