2010-04-30 22 views
5

qué significa el código 0x80 cuando se refiere a los controles de teclado en el entorno Windows de C++?¿Qué significa el código 0x80 cuando se refiere a los controles de teclado

Por ejemplo,

if(GetKeyState('K') & 0x80) { 
    //do something 
} 

Gracias a todos!

+0

yo creo que hay un error en el ejemplo de código - que debería ser GetKeyState ('K') y 0x8000 – Stewart

+0

parece estar trabajando en mi solicitud como es sin embargo? – Paz

+2

¿Qué quiere decir con "trabajar"? Si no sabes lo que se supone que debe hacer, ¿cómo sabes que está funcionando? – Stewart

Respuesta

1

Según the documentation

El valor de retorno especifica el estado de la tecla virtual especificada:
Si el bit de orden superior es 1, la clave es abajo; de lo contrario, está arriba.
Si el bit de orden inferior es 1, la tecla se conmuta. Una tecla, como la tecla BLOQ MAYÚS, se activa si está encendida. La tecla está apagada y alternada si el bit de orden inferior es 0. La luz indicadora de una tecla de alternancia (si hay alguna) en el teclado estará encendida cuando la tecla esté conmutada, y desactivada cuando la tecla esté alternada.

Tal vez con una clave no conmutable (una 'K' tal), el de orden inferior (término ambiguo - quizás que significan 0x0080?) y de orden superior (0x8000) bits hacen lo mismo?

+0

La documentación de MSDN no está Ambigous: el bit de orden alto de un CORTO es 0x8000. El bit de orden inferior es 0x0001. Sé que esto es cierto porque, cuando uso esta función, generalmente la pruebo con <0 en lugar de & 0x8000; logra lo mismo. – Stewart

+0

@Stewart: Eso es lo que yo también pensaría, pero entonces, ¿por qué en el mundo funcionaría esto (si de hecho funciona)? ... Además, lo que usted indicó no tiene nada que ver con si el "bit de orden inferior" es 0x0080 o 0x0001 .. –

+0

No creo que alguna vez haya tenido necesidad de un bit bajo. Sospecho que el código "funciona" porque la documentación no dice nada sobre el significado de los bits 1 a 14. Para una clave no conmutable deprimida 0xfffe sería un valor de retorno perfectamente valioso dentro del significado de los documentos – Stewart

7

actualización

Una ráfaga de downvotes me impulsó a investigar más a fondo. Así es como funcionan los valores de retorno (en hex) de GetKeyState. No obtengo la propiedad de alternar de una clave como k, pero asumo que hay un estado predeterminado al que se alterna.

0  Default State, key up 
ff80 Default state, key down 
1  Toggled, key up 
ff81 Toggled, key down 

Así se añade 0xff80 cada vez que el bit de orden debe ser establecido y el bit de orden inferior tiene sentido. Así que ahora sabemos por qué funciona el método 0x80, ¡ya que también se establece el bit de orden superior del byte inferior!

respuesta Antiguo

GetKeyState devuelve un SHORT donde si el bit de orden superior es 1 significa que la clave está arriba. La operación bitwise AND con 0x80 solo comprueba si ese bit es 1 dado que en el código binario 0x80 es 10000000.

Por lo tanto la declaración GetKeyState('K') & 0x80 volvería 0x80 si el bit de orden superior del valor devuelto por GetKeyState('K') es 1 y 0 si el bit de orden superior es 0.

+1

Sin embargo, el bit de orden superior de un 'CORTO' sería '0x8000' –

+0

Ese sería el alto de un BYTE, pero la función devuelve CORTO, que es de 16 bits – Stewart

+0

¡He actualizado mi respuesta con la solución! – Jacob

3

Los MSDN documentation of the function estados:

Si el bit de orden superior es 1, la clave es abajo; de lo contrario, está arriba.

bit a bit y con 0x80 le da el bit de orden superior, los if comprueba si el resultado es cero o distinto de cero y, en esencia comprueba el valor de ese bit.

Sin embargo, esta comprobación se ve como un error ya que GetKeyState() devuelve y comprueba el bit de orden superior de un corto que necesita para bit a bit y con 0x8000.
Así que le sugiero que verifique el valor de retorno con un depurador y verifique cómo funciona esto en la realidad.

2

Creo que te refieres a 0x8000, no a 0x80. Si ese es el caso, debe consultar la documentación (http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx) que tiene lo siguiente que decir sobre el valor de retorno de GetKeyState: -

El valor de retorno especifica el estado de la tecla virtual especificada, de la siguiente manera:

• Si el bit de orden superior es 1, la tecla está desactivada; de lo contrario, está arriba. • Si el bit de orden inferior es 1, la tecla se alterna. Una tecla, como la tecla BLOQ MAYÚS, se activa si está activada. La tecla está apagada y alternada si el bit de orden inferior es 0. La luz indicadora de una tecla de alternancia (si hay alguna) en el teclado estará encendida cuando la tecla esté conmutada, y desactivada cuando la tecla esté alternada.

0x80 no significa nada por lo que yo sé, aunque

+0

'0x80' funcionará, verifique mi respuesta. – Jacob

+0

Funcionará, pero depende del comportamiento no documentado. 0x8000 es mejor. – Stewart

Cuestiones relacionadas