C # में विंडोज फॉर्म फॉर्म बंद करने के लिए एस्केप बटन


91

मैंने निम्नलिखित कोशिश की है:

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();
}

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

मेरे Windows प्रपत्र प्रपत्र के गुण पर KeyPreview सत्य पर सेट है ... मैं गलत क्या कर रहा हूँ?


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

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

@SteveDanner, इवेंट ट्रिगर नहीं होता है। शायद InitializeComponent () में घोषणा गायब है।
शिशुप्रो। अरविंद '12

मुझे लगता है कि इसका कारण यह नहीं है कि
बीकॉज है

जवाबों:


199

यह हमेशा उचित ईवेंट हैंडलर असाइनमेंट, 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);
    }

10
-1, फॉर्म कैंसिलबटन संपत्ति का उपयोग करना सही तरीका है।
एबीसीडी

14
1980 के दशक में बुलाया गया, वे अपने संवाद बॉक्स को वापस चाहते हैं।
हंस पैसेंट

1
आप यह भी संकेत trueसे लौट सकते हैं ProcessCmdKeyकि कुंजी को संभाला जाता है, इसलिए "डिंग" शोर को रोकना चाहिए।
डरावना

8
यदि प्रपत्र पर वास्तविक बटन है (या एक IButtonControl इंटरफ़ेस ऑब्जेक्ट) तो आप केवल फॉर्म का एक कैंसल बट्टन संपत्ति का उपयोग कर सकते हैं।
डेविड

3
यह विकल्प अच्छा है। रद्द करेंबटन को फॉर्म पर अतिरिक्त दृश्यमान 'रद्द' बटन की आवश्यकता है । यह निरर्थक रेंडर + कोड + आदि है
V319

64

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


2
मैंने ऐसा किया है, लेकिन जब मैं esc दबाता हूं तो इसे निकाल नहीं दिया जाता है, क्यों?
मिहाई ब्राटुल्स्कु

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

15

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


9

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

डिबगिंग के बाद मुझे पता चला कि इस फ़ॉर्म के 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) प्राप्त करने से रोक रहा था । इसलिए सुनिश्चित करें कि कोई बच्चा नियंत्रण आपके इनपुट पर नहीं ले रहा है।


मेरे सिर के ऊपर से, निश्चित नहीं है कि क्या आपको सच में KeyPreview सेट करने की आवश्यकता है - msdn.microsoft.com/en-us/library/…
Andez

मैं अपने winform पर ListView नियंत्रण के साथ इस समस्या का सामना कर रहा हूँ। मुझे आश्चर्य है कि क्या यह सूची दृश्य है जहाँ आपने समस्या देखी है?
raddevus

1

आप अपने प्रपत्र विकल्पों में KeyPreview को सही पर सेट करते हैं और फिर आप इसमें Keypress घटना को जोड़ते हैं। अपने कीप ईवेंट में आप निम्नलिखित टाइप करें:

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

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


यह समस्या का एक अच्छा समाधान है। मेरे पास इस पर ListView नियंत्रणों के साथ एक फॉर्म है और उस स्थिति में वे कैंसबटन (जब Esc दबाया जाता है) को निगलने लगते हैं। मैंने इस कोड को जोड़ा और इसने इस मुद्दे को ठीक किया।
राडदेवस

0

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


0

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

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

0

आप ट्रिगर को किसी अन्य रूप में भी कर सकते हैं।

उदाहरण के लिए, रद्द करें-बटन को ट्रिगर करें यदि आप फ़ॉर्म रद्द करें बटन संपत्ति को संपादित करते हैं और बटन रद्द करें सेट करें।

कोड में आप रद्द करें बटन को इस प्रकार बंद करते हैं:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.