2010-09-30 13 views
7

जब Control.OnKeyPress घटना से निपटने, वहाँ एक KeyPressEventArgs कि एक KeyChar होता है।नियंत्रण पर रखें। KeyDown?

उपयोगिता कारणों के लिए मुझे बिल्कुल KeyChar की आवश्यकता है, लेकिन OnKeyDown ईवेंट को संभालने पर।

KeyEventArgs किसी भी चार से संबंधित डेटा शामिल नहीं करता है। मेरा मतलब, अगर साथ या Shift बिना A कुंजी दबाएँ अपने KeyCode, KeyData या KeyValue को प्रभावित नहीं। एक और भाषा का उपयोग करते समय, मुझे अभी भी पूंजीगत अंग्रेजी मूल्य मिल रहा है।

कैसे एक KeyPressEventArgs.KeyCharKeyDown अंदर घटना प्राप्त करने के लिए?

धन्यवाद।

+2

और जो चार आप चाहते हैं जब Alt कुंजी जारी की है क्या ज़रूरत है? –

+1

'fireing KeyPress' नहीं जब Alt कुंजी जारी की है, लेकिन' वैसे भी फायरिंग, इस मामले में चार '\ 0' काफी अच्छा है OnKeyDown'। – DxCK

उत्तर

9

यह बदलें। 'ए' को 'ए' में परिवर्तित करने के लिए यहां सरल कार्य है। यह [A-Z] सेट से ही राजधानी वर्ण बदल देता है। मान 32 'ए' और 'ए' के ​​बीच भिन्न है .. निश्चित रूप से आप इसे अपनी आवश्यकताओं के अनुसार बढ़ा सकते हैं, या यहां सुविधा के लिए पूछ सकते हैं।

char getChar(KeyEventArgs e) 
{ 
int keyValue = e.KeyValue; 
if (!e.Shift && keyValue >= (int) Keys.A && keyValue <= (int) Keys.Z) 
    return (char)(keyValue + 32); 
return (char) keyValue; 
} 

आप अगर आप इसे अपने वर्तमान संस्कृति के साथ काम करता है जरुरी है चाहिए ProcessKeyMessage नियंत्रण विधि:

protected override bool ProcessKeyMessage(ref Message m) 
{ 
if ((m.Msg == 0x102) || (m.Msg == 0x106)) // this is special - don't remove 
{ 
    char c = (char) m.WParam; // here is your char for OnKeyDown event ;) 
} 
return base.ProcessKeyMessage(ref m); 
} 

आशा है कि यह उपयोगी।

+1

और मैं सक्रिय भाषा पर विचार कैसे कर रहा हूं? उदाहरण के लिए, यदि सक्रिय भाषा रूसी है, तो मैं रूसी वर्ण प्राप्त करना चाहता हूं। – DxCK

+1

आप अपनी पोस्ट में वर्णित की तरह ProcessKeyMessage नियंत्रण विधि ओवरराइड करना चाहिए। – mastak

+0

दूसरा कोड पर्याप्त है, यह भी shfit पकड़ता है। – Letterman

0

मुझे लगता है कि क्या आप देख रहे हैं वास्तव में कीकोड संपत्ति है।

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Determine whether the key entered is the F1 key. If it is, display Help. 
    if(e.KeyCode == Keys.A) 
    { 
     // Do something kewl 
    } 
    else if(e.KeyCode == Keys.B) 
    { 
     // Do something even kewler 
    } 
} 

तुम सिर्फ कुछ चाबियाँ आप सेटअप एक स्विच बयान या जो कुछ भी अपने दिल इच्छाओं कर सकता के लिए देख रहे हैं।

0

यदि आप कुंजीपटल के बजाए कीडाउन का उपयोग करना चाहते हैं, तो कुंजीडाउन ईवेंट को दी गई अतिरिक्त जानकारी को कैप्चर करना है, तो क्या आप शायद उस अतिरिक्त जानकारी को कुंजीडाउन ईवेंट में कैप्चर कर सकते हैं और फिर जब आप कुंजीपटल प्राप्त करते हैं तो इसका उपयोग करें ? बल्कि एक सस्ती दृष्टिकोण, सुनिश्चित करने के लिए है, लेकिन मैं किसी भी अन्य दृष्टिकोण है कि वास्तव में एक कुंजीपटल मानचित्रण "मृत कुंजी" (यानी दो प्रमुख दृश्यों है कि एक ही चरित्र का उत्पादन) है कि में काम करेंगे के बारे में सुनिश्चित नहीं हूँ। मैं नहीं पता है क्यों माइक्रोसॉफ्ट कुंजी दबाने घटना (या इसके घटनाओं का एक बहुत, उस बात के लिए) के लिए के माध्यम से साथ ले जाने के बारे में अधिक जानकारी नहीं किया सही नहीं है कारण और प्रभाव की घटनाओं से मेल करने की कोशिश कर के बाद से, लेकिन मैं डॉन वास्तव में कोई बेहतर विकल्प नहीं पता है।

+0

कारण मैं उपयोग करना चाहते हैं '' बजाय KeyPress' की KeyDown' मेरा कार्यक्रम की प्रतिक्रिया जब तक एक कुंजी दबाने उपयोगकर्ता के बीच के समय को कम करना है। उपयोगकर्ता ने कुंजी छोड़ने के बाद ही 'कीप्रेस' फायरिंग की, और यह मेरे प्रोग्राम का जवाब देने तक अतिरिक्त अनावश्यक समय जोड़ता है। – DxCK

संबंधित मुद्दे