2012-02-28 97 views
8

我有一個小C#控制檯應用程序讀取的關鍵,並檢查是否的關鍵是一個問號:ConsoleKeyInfo,問號和可移植性

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

我在Oem2通過看什麼樣的價值實際上是抵在調試器中分配,因爲問號沒有ConsoleKey code

現在我當然可以使用ki.KeyChar來代替,但應用程序還需要響應某些不映射到字符的鍵(例如媒體鍵)。檢查ConsoleKeyKeyChar以確定哪個鍵實際上已被按下,這感覺不雅觀。另一方面,依靠Oem2在所有情況和地區總是映射到?並不安全。

最好的做法是檢查兩個屬性以確定哪個鍵實際上被按下了?

任何洞察爲什麼ConsoleKeyInfo是這樣設計的讚賞。

回答

6

在這種情況下,您將必須檢查KeyChar == '?'。從MSDN

Oem2:OEM 2密鑰(OEM特定)。

所以你只是幸運的,它恰好是你的設備上的?

ConsoleKeyInfo結構提供了KeyChar(一個Char值)以及Modifiers(枚舉)來幫助您確定用戶按下了哪些鍵。

2

我想你應該考慮當某人有不同的鍵盤佈局時會發生什麼。

如果您想查詢「我的電腦上有問號的鑰匙」,則請使用ConsoleKey。但這可能不是一個好主意,你應該堅持用戶的設置並使用KeyChar

但是對於沒有映射到字符的鍵(並且用戶無法使用不同的鍵盤佈局重新映射它們),您必須使用ConsoleKey

所以,是的,我認爲你應該在這種情況下檢查兩個屬性。

2

我想這樣設計的原因是,Console.ReadKey()依賴於返回KEY_EVENT_RECORD結構的陣列中一個按鍵,其中,每個鍵事件具有ASCII/Unicode字符表示和virtual key code的情況下的本機函數(ReadConsoleInput)。請注意我之前鏈接中的VK_OEM_2 - 這是值來自ConsoleKey.Oem2的地方。