2010-04-30 18 views
5

cosa significa il codice 0x80 quando si fa riferimento ai controlli da tastiera nell'ambiente Windows C++?Che cosa significa il codice 0x80 quando ci si riferisce ai controlli da tastiera

Per esempio,

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

Grazie a tutti!

+0

Penso che tu abbia un errore di battitura nel tuo esempio di codice - dovrebbe essere GetKeyState ('K') e 0x8000 – Stewart

+0

che sembra funzionare nella mia applicazione come è? – Paz

+2

Cosa intendi con "lavoro"? Se non sai cosa dovrebbe fare, come sai che sta funzionando? – Stewart

risposta

1

Secondo the documentation

Il valore restituito specifica lo stato del tasto virtuale specificata:
Se il bit di ordine superiore è 1, la chiave è giù; altrimenti, è finito.
Se il bit di ordine inferiore è 1, la chiave è attivata. Una chiave, come il tasto BLOC MAIUSC, viene attivata se è attivata. Il tasto è disattivato e disattivato se il bit di ordine basso è 0. L'indicatore luminoso del tasto di commutazione (se presente) sulla tastiera si accende quando si preme il tasto e si spegne quando il tasto è disattivato.

Forse con una chiave non toggleable (ad esempio una 'K'), il basso-ordine (ambiguo termine - forse significano 0x0080?) e di ordine superiore (0x8000) bit fanno la stessa cosa?

+0

La documentazione MSDN non è ambiguo: il bit di ordine superiore di SHORT è 0x8000. Il bit di ordine basso è 0x0001. So che questo è vero perché quando ho usato questa funzione solitamente lo collaudo con <0 anziché con 0x8000 - ottiene la stessa cosa. – Stewart

+0

@Stewart: Questo è quello che penserei anch'io - ma allora, perché nel mondo questo lavoro (se funziona davvero)? ... Inoltre, quello che hai dichiarato non ha nulla a che fare con il "bit di basso ordine" è 0x0080 o 0x0001 .. –

+0

Non credo di aver mai avuto bisogno del bit basso. Sospetto che il codice "funzioni" perché la documentazione non dice nulla sul significato dei bit da 1 a 14. Per una chiave non scambiabile abbreviata, 0xfffe sarebbe un valore di ritorno perfettamente valido nel significato dei documenti – Stewart

7

Aggiornamento

Una raffica di downvotes mi ha spinto in indagando questo ulteriore. Ecco come funzionano i valori di ritorno (in hex) di GetKeyState. Non ho abbastanza la proprietà di commutazione di una chiave come ma suppongo che ci sia uno stato predefinito da cui alterna.

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

Così 0xff80 si aggiunge ogni volta che il bit di ordine deve essere impostato e il bit di ordine inferiore ha un senso. Così ora sappiamo perché l'approccio 0x80 funziona --- poiché anche il bit di ordine superiore del byte inferiore è impostato!

Vecchio risposta

GetKeyState restituisce un SHORT in cui se il bit di ordine superiore è 1 significa che la chiave è in alto. L'operazione bitwise AND con 0x80 controlla solo se quel bit è 1 poiché in binario 0x80 è 10000000.

Pertanto la dichiarazione GetKeyState('K') & 0x80 sarebbe tornato 0x80 se il bit di ordine superiore del valore restituito da GetKeyState('K') è 1 e 0 se il bit di ordine superiore è 0.

+1

Tuttavia, il bit di ordine elevato di un 'SHORT' sarebbe' 0x8000' –

+0

Quello sarebbe il bit più alto di un BYTE, ma la funzione restituisce SHORT, che è 16 bit – Stewart

+0

Aggiornamento della mia risposta con la soluzione! – Jacob

3

I MSDN documentation of the function stati:

Se il bit di ordine superiore è 1, la chiave è verso il basso; altrimenti, è finito.

bit-saggio e con 0x80 ti dà il bit di ordine superiore, le if controlla se il risultato è zero o diverso da zero e in sostanza controlla il valore di quel po '.

Questo controllo tuttavia si presenta come un errore in quanto GetKeyState() restituisce un SHORT e per controllare il bit di ordine alto di un corto è necessario bit-saggio e con 0x8000.
Quindi suggerisco di controllare il valore restituito con un debugger e verificare come funziona nella realtà.

2

Penso che intendiate 0x8000, non 0x80. Se questo è il caso, si consiglia di consultare la documentazione (http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx), che ha il seguente da dire sul valore di ritorno di GetKeyState: -

Il valore restituito specifica lo stato del tasto virtuale specificata, come segue:

• Se il bit di ordine più alto è 1, il tasto è premuto; altrimenti, è finito. • Se il bit di ordine inferiore è 1, la chiave è attivata. Una chiave, come il tasto BLOC MAIUSC, viene attivata se è attivata. Il tasto è disattivato e disattivato se il bit di ordine basso è 0. L'indicatore luminoso del tasto di commutazione (se presente) sulla tastiera si accende quando si preme il tasto e si spegne quando il tasto è disattivato.

0x80 non significa nulla per quanto ne so se

+0

'0x80' funzionerà, controlla la mia risposta. – Jacob

+0

Funzionerà, ma dipende dal comportamento non documentato. 0x8000 è migliore. – Stewart