2012-02-28 12 views
8

mam trochę C# aplikacji konsoli, która odczytuje klucz i sprawdza, czy klucz był znak zapytania:ConsoleKeyInfo pytanie Mark i Przenośność

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

I przybył Oem2 widząc jaka wartość jest rzeczywiście przypisane w debugerze, ponieważ nie istnieje ConsoleKey code dla znaku zapytania.

Teraz mogę oczywiście użyć ki.KeyChar, ale aplikacja musi również reagować na pewne klucze (np. Klucze multimedialne), które nie są mapowane na znaki. Czuł się nieelegancko, aby sprawdzić, który z klawiszy został naciśnięty, i zarówno ConsoleKey jak i KeyChar. Z drugiej strony nie jest bezpiecznie polegać na Oem2, aby zawsze mapować na ? we wszystkich okolicznościach i regionach.

Czy najlepiej sprawdzać obie właściwości, aby określić, który klawisz został naciśnięty?

Dowiemy się, dlaczego ConsoleKeyInfo zostało zaprojektowane w ten sposób.

Odpowiedz

6

W takim przypadku musisz sprawdzić KeyChar == '?'. Od MSDN:

Oem2: klucz OEM 2 (specyficzny dla OEM).

Po prostu masz szczęście, że jest to ? na twoim sprzęcie.

Struktura ConsoleKeyInfo zapewnia KeyChar (wartość Char), jak również Modifiers (wyliczenie), aby pomóc Ci zdecydować, jakie klawisze użytkownik przycisnął.

2

Myślę, że powinieneś rozważyć, co się dzieje, gdy ktoś ma inny układ klawiatury.

Jeśli chcesz sprawdzić "klucz ze znakiem zapytania na komputerze mój komputer", a następnie użyj ConsoleKey. Ale to prawdopodobnie nie jest dobry pomysł i prawdopodobnie powinieneś przestrzegać ustawień użytkownika i używać KeyChar.

Jednak w przypadku kluczy, które nie są mapowane na znaki (a użytkownik nie może ich zmapować za pomocą innego układu klawiatury), należy użyć ConsoleKey.

Tak, tak, myślę, że powinieneś sprawdzić obie właściwości w tym przypadku.

2

Myślę, że powodem tej konstrukcji jest to, że Console.ReadKey() opiera się na rodzimej funkcji (ReadConsoleInput), która zwraca tablicę KEY_EVENT_RECORD struktur w przypadku naciśnięcia klawisza, gdzie każdy klawisz zdarzenie ASCII/Unicode reprezentacji znaków i virtual key code. Zwróć uwagę na VK_OEM_2 w moim poprzednim łączu - stąd pochodzi wartość ConsoleKey.Oem2.

Powiązane problemy