2012-02-28 9 views
8

मैं एक छोटे से सी # कंसोल अनुप्रयोग है कि एक महत्वपूर्ण और चेक पढ़ता है, तो कुंजी एक प्रश्न चिह्न था देखना है:ConsoleKeyInfo, प्रश्न चिह्न और पोर्टेबिलिटी

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

मैं देख क्या मूल्य वास्तव में है द्वारा Oem2 पर पहुंचे डीबगर में असाइन किया गया, क्योंकि प्रश्न चिह्न के लिए ConsoleKey code नहीं है।

अब मैं निश्चित रूप से ki.KeyChar का उपयोग कर सकता हूं, लेकिन एप्लिकेशन को कुछ कुंजी (उदा। मीडिया कुंजी) का जवाब देने की आवश्यकता है जो वर्णों को मैप नहीं करते हैं। यह निर्धारित करने के लिए कि कौन सी कुंजी वास्तव में दबाई गई है, यह ConsoleKey और KeyChar दोनों को जांचने में सुरुचिपूर्ण लगता है। दूसरी तरफ, सभी परिस्थितियों और क्षेत्रों में ? पर हमेशा मानचित्र पर Oem2 पर भरोसा करना सुरक्षित नहीं लगता है।

क्या यह निर्धारित करने के लिए दोनों गुणों की जांच करना सबसे अच्छा अभ्यास है कि वास्तव में कौन सी कुंजी दबाई गई थी?

कंसोलकेइन्फो को इस तरह से डिजाइन किए जाने के तरीके में कोई अंतर्दृष्टि की सराहना की गई है।

उत्तर

6

इस मामले में, आपको KeyChar == '?' जांचना होगा। MSDN से:

ओम 2: OEM 2 कुंजी (OEM विशिष्ट)।

तो आप बस भाग्यशाली हो रहे हैं कि यह आपके उपकरण पर ? होता है।

ConsoleKeyInfo संरचना KeyChar (एक Char मूल्य) और साथ ही Modifiers (एक गणन) आप यह तय करें कि कुंजी उपयोगकर्ता दबाया था मदद करने के लिए प्रदान करता है।

2

मुझे लगता है कि आपको यह समझना चाहिए कि किसी के पास अलग-अलग कीबोर्ड लेआउट होने पर क्या होता है।

यदि आप पर मेरे कंप्यूटर पर प्रश्न चिह्न के साथ कुंजी "की जांच करना चाहते हैं, तो ConsoleKey का उपयोग करें। लेकिन शायद यह एक अच्छा विचार नहीं है और आपको शायद उपयोगकर्ता की सेटिंग्स का पालन करना चाहिए और KeyChar का उपयोग करना चाहिए।

लेकिन उन चाबियों के लिए जो वर्णों पर मैप नहीं करते हैं (और उपयोगकर्ता विभिन्न कीबोर्ड लेआउट का उपयोग करके उन्हें रीमेप नहीं कर सकते हैं), आपको ConsoleKey का उपयोग करना होगा।

तो, हाँ, मुझे लगता है कि आपको इस मामले में दोनों संपत्तियों की जांच करनी चाहिए।

2

मुझे लगता है कि इस डिजाइन के लिए कारण यह है कि Console.ReadKey() एक देशी समारोह (ReadConsoleInput) है कि एक कुंजी दबाने, जहां प्रत्येक महत्वपूर्ण घटना एक ASCII/यूनिकोड वर्ण प्रतिनिधित्व और एक virtual key code है के मामले में KEY_EVENT_RECORD संरचनाओं की एक सरणी देता है पर निर्भर करता है। मेरे पिछले लिंक में VK_OEM_2 पर ध्यान दें - यह वह जगह है जहां ConsoleKey.Oem2 मान आता है।