2009-12-30 8 views
7

मेरे पास एक टेक्स्ट बॉक्स वाला एक फॉर्म है। कोई अन्य नियंत्रण नहीं। जब भी मैं 'एंटर' कुंजी या 'Esc' कुंजी टाइप करता हूं, तो फॉर्म मेरी इच्छानुसार कार्य करता है; लेकिन मैं उस भयानक विंडोज त्रुटि ध्वनि सुनता हूँ। कोड निम्नलिखित के समान दिखता है ...'एंटर' या 'Esc' टाइप करते समय विंडो त्रुटि ध्वनि को कैसे रोकें

public class EntryForm: Form 
{ 
    public EntryForm() 
    { 
    } 

    private void EntryTextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
    if(e.KeyCode == Keys.Enter) 
    { 
     // do some stuff 
     Hide(); // I've also used DialogResult = DialogResult.OK here 
     e.Handled = true; 
    } 
    else if(e.KeyCode == Keys.Escape) 
    { 
     Hide(); // I've also used DialogResult = DialogResult.Cancel here 
     e.Handled = true; 
    } 
    } 
} 

मैं इसे 'हैक' कर सकते हैं और फ़ॉर्म की निर्माता के लिए निम्न कोड जोड़कर शोर रोक सकते हैं।

AcceptButton = new Button(); 
CancelButton = new Button(); 

जैसा कि मैंने कहा है कि यह ध्वनि नहीं खेलती है, लेकिन मुझे लगता है कि यह खराब रूप है; खासकर जब से मुझे फॉर्म पर एक बटन की आवश्यकता नहीं है।

कोई भी जानता है कि यह व्यवहार क्यों है और यदि त्रुटि ध्वनि को खेलने से रोकने के लिए क्लीनर तरीका है?

+0

यदि आपके पास कोई बटन नहीं है, तो आप एंटर या एएससी दबाते समय संवाद कैसे प्राप्त कर रहे हैं? जब आप एंटर या एएससी दबाते हैं तो जस के साथ एक फॉर्म सामान्य रूप से बस वहां बैठेगा। –

+0

@ जॉन नोवेलर - छुपाएं() विधि फॉर्म को छुपाती है। आप दृश्यमान संपत्ति को झूठी भी सेट कर सकते हैं। यदि आपने फ़ॉर्म को सामान्य रूप से दिखाया है, तो आपको केवल कोड से संवाद परिणाम सेट करना होगा और फॉर्म गायब हो जाएगा। –

उत्तर

6

एक और "सही" फिक्स है, जो कि आपके पास कितने नियंत्रण हैं और विंडोज फॉर्म डिज़ाइन मॉडल का पालन करता है, इस पर ध्यान दिए बिना काम करता है। अपने प्रपत्र में यह कोड पेस्ट करें:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == Keys.Escape || keyData == Keys.Enter) { 
    this.Hide(); 
    return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 
+0

@ नोबगज़ - यह एक चैंप की तरह काम करता था। धन्यवाद। –

12

कुंजीडाउन ईवेंट में, e.Handled = true और e.SuppressKeyPress = true सेट करें।

+0

@ एंड्रयू - ऐसा करने से व्यवहार पर कोई प्रभाव नहीं पड़ा। उत्तर के लिए धन्यवाद, हालांकि, जैसा कि मैंने पहले कभी SuppressKeyPress संपत्ति नहीं देखी थी। –

+0

यह मेरे लिए काम किया। – kervin

+0

मेरे लिए भी काम किया! धन्यवाद :) – Jake

2

इसमें काफ़ी समय Nobugz जवाब देने के लिए एक उत्तर एक टिप्पणी में फिट करने के लिए है। आप Nobugz कोड का उपयोग करते हैं प्रकार है:

  1. पर्चा कोई फर्क नहीं पड़ता जो फार्म पर नियंत्रित कर सक्रिय है और कीबोर्ड इनपुट ध्यान केंद्रित किया छिपा हो जा रहा है, और इस बात का है कि क्या रूप है 'KeyPreview स्वतंत्र है संपत्ति 'सच या गलत' पर सेट है।

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
        if (msg.HWnd == textBox1.Handle) 
        { 
         if (keyData == Keys.Escape || keyData == Keys.Enter) 
         { 
          textBox1.Hide(); 
          return true; 
         } 
        } 
        return base.ProcessCmdKey(ref msg, keyData); 
    } 
    
    बेशक

    यदि आप चाहते थे:

यहाँ आप केवल एक विशिष्ट नियंत्रण (इस मामले में 'textBox1 नाम के एक पाठ बॉक्स) ProcessCmdKeys से अधिक सवारी में छिपा हो बनाने के लिए क्या करने की जरूरत है छुपाए जाने की आवश्यकता वाले कई नियंत्रणों के मामले को संभालें, आप 'स्विच कथन या जो भी संदेश का परीक्षण करने के लिए जो भी हो। एचडब्ल्यूएनडी: नोट मैं इस धारणा को यहां कार्यान्वित कर सकता हूं कि कीबोर्ड नियंत्रण वाले सभी नियंत्रणों में वैध एचडब्ल्यूएनडी होगा। एक स्थिति है जिसमें मैं इस तकनीक का इस्तेमाल किया है, और एक पाठ इनपुट नियंत्रण के

कुछ स्मृति (अस्पष्ट) किसी भी तरह अभी भी कीबोर्ड इनपुट ध्यान केंद्रित करती थी ... जब मैं यह करने के लिए ... मुझे एक जोड़ना चाहते हैं बनाता है के लिए इरादा नहीं था इस तरह अतिरिक्त परीक्षण:

&& this.ActiveControl == textBox1 

लेकिन, ले कि यह जरूरी है कि एक "नमक की अनाज" के बाद से मैं कुछ नहीं किया जा सकता है।

+0

@ बिलवा - अतिरिक्त जानकारी के लिए धन्यवाद। इस मामले में, मैं चाहता हूं कि पूरा फॉर्म छुपाया जाए; लेकिन जानकारी भविष्य के लिए जानना अच्छा है। –

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