2011-06-13 14 views
5

Me gustaría tener un evento booleano para alternar cuando se presiona una tecla. Específicamente, la tecla 's'. Me han señalado la función GetKeyState(), que supuestamente funciona bajo la API de Win32. Entiendo el código ASCII para la letra 's' es 115, por lo que mi código es el siguiente:Usando GetKeyState()

if (GetKeyState(115) == 1) 
{ 
<EVENT> 
} 

Sin embargo, esto no funciona. ¿Por qué? Aquí está la referencia de MSDN: http://msdn.microsoft.com/en-us/library/ms646301%28v=vs.85%29.aspx ... "Si el bit de orden inferior es 1, la clave se puede cambiar entre"

Respuesta

14

Por lo que entiendo que tiene que hacer:

if(GetKeyState(115) & 0x8000) 
{ 
    <EVENT> 
} 

El bit más alto dice si la tecla está presionada El más bajo indica si la tecla está activada (como, si el bloqueo de mayúsculas está activado).

+1

Gracias, lo he intentado pero aun así mi evento no ocurre cuando presiono 's'. El programa compila bien sin embargo. Estoy usando Win32 API, ¿me falta algo más? El compilador obviamente reconoce la función ... – CaptainProg

+0

Quizás quiera [GetAsyncKeyState] (http://msdn.microsoft.com/en-us/library/ms646293). 'GetKeyState' tiene que ser llamado en respuesta al evento del teclado. –

+0

Los códigos de teclas virtuales para las teclas de letras corresponden a los códigos ASCII de las letras mayúsculas. Incluso puede usar un 'char' en lugar de' int', lo que hace que el código sea más legible. Por lo tanto, intente con 'GetKeyState ('S')' – kiw

-5

Poco tarde para esto pero el bit de orden superior es 0x80000000 no 0x8000, cámbielo y funcionará correctamente.

El otro bit, útil para nada, actúa como si presionara CAPS LOCK al presionar LSHIFT.

+5

como se indica en [GetKeyState MSDN reference] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646301 (v = vs.85) .aspx), el valor de retorno es 'CORTO' (16 bits), no un valor de 32 bits (en otras palabras,' 0x80000000' no es válido). – EDDY74

5

Dado que SHORT está firmado, el bit de orden superior es igual al bit de signo.

modo, comprobar si se pulsa una tecla determinada, basta con comprobar si el valor devuelto por GetKeyState() es negativo:

if (GetKeyState('S') < 0) { 
    // The S key is down. 
} else { 
    // The S key is up. 
} 

Además, 115 es el código ASCII para 's'. Creo que deberías usar el mayúscula 83 para probar la tecla 'S'.

Cuestiones relacionadas