2010-02-18 6 views
78

मैं निम्नलिखित की कोशिश की है में फार्म:एस्केप बटन बंद करने के लिए Windows Forms सी #

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if ((Keys) e.KeyValue == Keys.Escape) 
     this.Close(); 
} 

लेकिन यह काम नहीं करता।

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    base.OnKeyDown(e); 
    if (e.KeyCode == Keys.Escape) 
     this.Close(); 
} 

और अभी भी कुछ नहीं काम कर रहा है:

तब मैं इस कोशिश की।

मेरे विंडोज फॉर्म प्रपत्र गुणों पर कीप्रेव्यू सत्य पर सेट है ... मैं क्या गलत कर रहा हूं?

+1

क्या आपने उन तरीकों में ब्रेकपॉइंट सेट करने का प्रयास किया है? क्या घटना हैंडलर भी फायरिंग है? –

+0

@SteveDanner, ईवेंट ट्रिगर नहीं होता है। शायद InitializeComponent() में घोषणा गायब है। –

+1

फॉर्म प्रॉपर्टी 'CancelButton' जैसे अपना रद्द करें बटन नाम न दें। अन्यथा ऐसा लगता है कि आप CancelButton सेट नहीं कर सकते हैं। –

उत्तर

167

यह हमेशा काम करेंगे, भले ही उचित ईवेंट हैंडलर असाइनमेंट, KeyPreview, CancelButton आदि की:

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

आपको बहुत धन्यवाद! यह ठीक वही है जिसकी मुझे तलाश थी!!! – yeahumok

+3

प्रपत्र की रद्द करें बटन का उपयोग करके –

+8

-1 आकर्षण की तरह काम किया, सही तरीका है। – ABCD

51

आपको बस अपने रद्द बटन पर फॉर्म की CancelButton संपत्ति सेट करने में सक्षम होना चाहिए और फिर आपको किसी भी कोड की आवश्यकता नहीं होगी।

+1

मैंने ऐसा किया लेकिन जब मैं एएससी दबाता हूं तो इसे निकाल दिया नहीं जाता है, क्यों? –

+0

यह मेरे लिए बहुत अच्छा काम करता है।छोटे रूपों के लिए बहुत बेहतर है। – knut

15

मान लें कि आपके पास "रद्द करें" बटन है, फॉर्म की CancelButton संपत्ति (या तो डिज़ाइनर या कोड में) को स्वचालित रूप से इसकी देखभाल करनी चाहिए। बस बटन के Click ईवेंट में बंद करने के लिए कोड रखें।

0

एस्केप बटन से आपका एस्केप कुंजी का मतलब है? आपके कोड के आधार पर मुझे लगता है कि आप यही चाहते हैं। आप एप्लिकेशन भी कोशिश कर सकते हैं। एक्सिट(), लेकिन बंद करना चाहिए। क्या आपके पास एक कार्यकर्ता धागा है? यदि कोई गैर-पृष्ठभूमि थ्रेड चल रहा है तो यह एप्लिकेशन को खोल सकता है।

+0

डाउनवॉटर से कोई टिप्पणी? – SwDevMan81

5

स्वीकार किए जाते हैं जवाब वास्तव में सही है, और मैं का उपयोग किया है कि कई बार दृष्टिकोण। अचानक, यह अब और काम नहीं करेगा, इसलिए मुझे यह अजीब लगा। अधिकतर क्योंकि मेरा ब्रेकपॉइंट ईएससी कुंजी के लिए नहीं मारा जाएगा, लेकिन यह अन्य चाबियों के लिए हिट होगा।

डिबगिंग के बाद मुझे पता चला कि मेरी फार्म से नियंत्रणों में से एक ProcessCmdKey विधि अधिभावी किया गया था, इस कोड के साथ:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    // ... 
    if (keyData == (Keys.Escape)) 
    { 
     Close(); 
     return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

... और इस ESC कुंजी को प्राप्त करने से मेरे रूप को रोकने की गई थी (return true पर ध्यान दें)। तो सुनिश्चित करें कि आपके इनपुट पर कोई भी बाल नियंत्रण नहीं ले रहा है।

+0

मेरे सिर के शीर्ष से बाहर है, सुनिश्चित नहीं है कि आपको सही के रूप में फॉर्म कीप्रेव्यू सेट सेट करने की आवश्यकता है - http://msdn.microsoft.com/en-us/library/system.windows.forms। form.keypreview (v = vs.110) .aspx – Andez

0

आपको "कुंजीअप" ईवेंट में इसे जोड़ने की आवश्यकता है।

private void Form1_KeyUp(object sender, KeyEventArgs e) 
    { 
     if(e.KeyCode == Keys.Escape) 
     { 
      this.Close(); 
     } 
    } 
0

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

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == 27) 
    { 
     Close(); 
    } 
} 

key.Char == 27 ASCII कोड में भागने का मूल्य है।

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