2012-02-28 15 views
8

Ho una piccola applicazione console C# che legge una chiave e controlli per vedere se la chiave era un punto interrogativo:ConsoleKeyInfo, il punto interrogativo e portabilità

ConsoleKeyInfo ki = System.Console.ReadKey(); 
if (ki.ConsoleKey.Oem2) // Do something 

sono arrivato al Oem2 da vedere quale valore è in realtà assegnato nel debugger, perché non c'è ConsoleKey code per il punto interrogativo.

Ora, potrei certamente usare ki.KeyChar, ma l'applicazione deve anche rispondere a determinati tasti (ad esempio i tasti multimediali) che non corrispondono ai caratteri. Non è bello controllare sia ConsoleKey sia KeyChar per determinare quale chiave è stata effettivamente premuta. D'altra parte, non è sicuro affidarsi a Oem2 per associare sempre a ? in tutte le circostanze e regioni.

È consigliabile controllare entrambe le proprietà per determinare quale tasto è stato effettivamente premuto?

Qualsiasi comprensione del motivo per cui ConsoleKeyInfo è stato progettato in questo modo è apprezzata.

risposta

6

In questo caso, è necessario verificare KeyChar == '?'. Da MSDN:

Oem2: la chiave OEM 2 (specifica OEM).

Quindi sei solo fortunato perché sembra essere un ? sul tuo equipaggiamento.

La struttura offre ConsoleKeyInfoKeyChar (un valore Char), così come Modifiers (un'enumerazione) per aiutarvi a decidere quali tasti che l'utente aveva premuto.

2

Penso che dovresti considerare cosa succede quando qualcuno ha un layout di tastiera diverso.

Se si desidera verificare "la chiave con il punto interrogativo su il mio computer", quindi utilizzare ConsoleKey. Ma probabilmente non è una buona idea e probabilmente dovresti aderire alle impostazioni dell'utente e usare KeyChar.

Ma per le chiavi che non mappa per a caratteri (e l'utente non li può rimappare utilizzando layout di tastiera diverso), è necessario utilizzare ConsoleKey.

Quindi, sì, penso che dovresti controllare entrambe le proprietà in questo caso.

2

Credo che la ragione di questo progetto è che Console.ReadKey() si basa su una funzione nativa (ReadConsoleInput), che restituisce un array di KEY_EVENT_RECORD strutture in caso di pressione di un tasto, in cui ogni evento chiave ha una rappresentazione di caratteri ASCII/Unicode e un virtual key code. Notare VK_OEM_2 nel mio collegamento precedente: qui è dove viene il valore ConsoleKey.Oem2.

Problemi correlati