2010-09-03 11 views
8

है, मैं अपने नियंत्रण में से एक पर कुंजी डाउन ईवेंट को प्रबंधित कर रहा हूं। यदि दबाया गया कुंजी वास्तविक इनपुट (वर्णमाला, संख्यात्मक, या किसी प्रकार का प्रतीक है) तो मैं इसे एक स्ट्रिंग में जोड़ना चाहता हूं। यदि यह एक नियंत्रण चरित्र है (प्रवेश, भागो, आदि ..) मैं कुछ भी नहीं करना चाहता।यह निर्धारित करने के लिए कि क्या KeyCode प्रिंट करने योग्य वर्ण

क्या यह निर्धारित करने का एक त्वरित और आसान तरीका है कि कुंजी कोड एक प्रिंट करने योग्य चरित्र या नियंत्रण चरित्र है या नहीं?

वर्तमान में मैं

if (e.KeyCode == Keys.Enter) 
     { 
     e.Handled = false; 
     return; 
     } 

कर रहा हूँ लेकिन मैं जानता हूँ कि शायद कुछ और कुंजी के बारे में मैं प्रणाली हैंडलर में है कि कुछ महत्वपूर्ण करना परवाह नहीं है देखते हैं, तो मैं उन्हें संभाल करने के लिए नहीं करना चाहती।

उत्तर

8

यदि आप केवल प्रिंट करने योग्य पात्र चाहते हैं, तो शायद आप OnKeyDown नहीं चाहते हैं। आपको इसके बजाय OnKeyPress का उपयोग करना चाहिए, जिसे प्रिंट करने योग्य वर्णों (अधिक या कम) के लिए केवल कहा जाता है, और संशोधक कुंजी (शिफ्ट, मुख्य रूप से) के लिए अनुवाद लागू करता है।

मैं "कम या ज्यादा" कहा ऊपर है, क्योंकि आप भी नियंत्रण वर्ण, जो जरूरी प्रिंट करने योग्य नहीं हैं मिल जाएगा। हालांकि, उन्हें char.IsControl के साथ आसानी से फ़िल्टर किया जा सकता है।

protected override void OnKeyPress(KeyPressEventArgs e){ 
    if(!char.IsControl(e.KeyChar)){ 
     // do something with printable character 
    } 
} 

कुछ इस तरह एक डिजाइन में आसानी से नज़रअंदाज़ कि बैकस्पेस कुंजी है। आम तौर पर, बैकस्पेस वर्ण ('\b', या (char)8) प्राप्त करने पर सबसे अच्छा व्यवहार आपके बफर से अंतिम वर्ण को निकालना है। ऐसा करना भूलना आसान है।

6

यदि आप KeyDown के बजाय KeyPress ईवेंट को संभालते हैं, तो KeyPressEventArgs में KeyChar संपत्ति होगी। इससे आपको "अतिरिक्त" महत्वपूर्ण घटनाओं की संख्या कम हो जाएगी। फिर आप जो चाहते हैं उसे फ़िल्टर करने के लिए char.IsLetterOrDigit या char.IsControl जैसे कुछ का उपयोग कर सकते हैं।

3

मान लें कि आपके पास केवल KeyCode है, तो आप MapVirtualKey फ़ंक्शन में P/Invoking का प्रयास कर सकते हैं। मुझे यकीन नहीं है कि यह सभी संस्कृतियों के लिए काम करेगा या नहीं।

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern int MapVirtualKey(int uCode, int uMapType); 

public static bool RepresentsPrintableChar(this Keys key) 
{ 
    return !char.IsControl((char)MapVirtualKey((int)key, 2)); 
} 

Console.WriteLine(Keys.Shift.RepresentsPrintableChar()); 
Console.WriteLine(Keys.Enter.RepresentsPrintableChar()); 
Console.WriteLine(Keys.Divide.RepresentsPrintableChar()); 
Console.WriteLine(Keys.A.RepresentsPrintableChar()); 

आउटपुट:

false 
false 
true 
true 
0

चेक इस समारोह, आप byte को char कास्ट करने के लिए (या बस समारोह को संपादित) चाहते हो सकता है:

bool IsPrintable(byte item) 
{ 
    // Range of chars from space till ~ (tilda) 
    return item >= 32 && item < 126; 
} 
संबंधित मुद्दे