ปุ่ม Escape เพื่อปิดฟอร์ม Windows Forms ใน C #


93

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

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

และยังไม่มีอะไรทำงาน

KeyPreview บนคุณสมบัติของฟอร์ม Windows Forms ของฉันถูกตั้งค่าเป็น true ... ฉันทำอะไรผิด?


1
คุณได้ลองตั้งเบรกพอยต์ด้วยวิธีการเหล่านั้นแล้วหรือยัง? ตัวจัดการเหตุการณ์กำลังเริ่มทำงานหรือไม่
Steve Danner

1
อย่าตั้งชื่อปุ่มยกเลิกของคุณเช่นคุณสมบัติแบบฟอร์ม 'CancelButton' มิฉะนั้นดูเหมือนว่าคุณไม่สามารถตั้งค่า CancelButton ได้
Jonas Middendorf

@SteveDanner เหตุการณ์ไม่ถูกทริกเกอร์ อาจไม่มีการประกาศใน InitializeComponent ()
InfantPro'Aravind '12

ฉันคิดว่าเหตุผลที่มันใช้ไม่ได้เป็นเพราะการควบคุมอื่น ๆ ในแบบฟอร์มได้รับโฟกัส ...
itsho

คำตอบ:


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 โดยใช้คุณสมบัติ CancelButton ของแบบฟอร์มเป็นวิธีที่ถูกต้อง
ABCD

14
ฮึคนยุค 80 โทรมาพวกเขาต้องการกล่องโต้ตอบกลับมา
Hans Passant

1
นอกจากนี้คุณยังสามารถกลับtrueจากProcessCmdKeyเพื่อส่งสัญญาณว่าคีย์ได้รับการจัดการดังนั้นจึงป้องกันไม่ให้เกิดเสียง "ding"
Spooky

8
คุณสามารถใช้คุณสมบัติ CancelButton ของฟอร์มได้ก็ต่อเมื่อแบบฟอร์มมีปุ่มอยู่จริง (หรืออ็อบเจ็กต์อินเตอร์เฟส IButtonControl)
เดวิด

3
ตัวเลือกนี้ดี CancelButton ต้องการปุ่ม 'ยกเลิก' ที่มองเห็นได้เพิ่มเติมในแบบฟอร์ม นี่คือการเรนเดอร์ + โค้ด + ฯลฯ ที่
ซ้ำซ้อน

64

คุณควรจะสามารถตั้งค่าCancelButtonคุณสมบัติของแบบฟอร์มเป็นปุ่มยกเลิกของคุณจากนั้นคุณจะไม่ต้องใช้รหัสใด ๆ


2
ฉันทำอย่างนั้น แต่มันไม่ยิงเมื่อฉันกด esc ทำไม?
Mihai Bratulescu

สิ่งนี้ได้ผลดีสำหรับฉัน ดีกว่ามากสำหรับรูปแบบขนาดเล็ก
knut

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

ดูเหมือนว่าฉันจะพบปัญหานี้กับการควบคุม ListView บน winform ของฉัน ฉันสงสัยว่ามันเป็น ListView ที่คุณเห็นปัญหาด้วยหรือไม่?
raddevus

2

คุณตั้งค่า KeyPreview เป็น true ในตัวเลือกแบบฟอร์มของคุณจากนั้นคุณเพิ่มเหตุการณ์ Keypress เข้าไป ในเหตุการณ์การกดแป้นพิมพ์ของคุณคุณพิมพ์สิ่งต่อไปนี้:

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

key.Char == 27 คือค่า Escape ในรหัส ASCII


นี่เป็นวิธีแก้ปัญหาที่ดีสำหรับปัญหานี้ ฉันมีแบบฟอร์มที่มีตัวควบคุม ListView อยู่และในกรณีนี้ดูเหมือนว่าพวกเขาจะกลืนปุ่ม CancelButton (เมื่อกด Esc) ฉันเพิ่มรหัสนี้และแก้ไขปัญหาได้แล้ว
raddevus

0

โดยปุ่ม Escape คุณหมายถึงปุ่ม Escape หรือไม่? ตัดสินโดยรหัสของคุณฉันคิดว่านั่นคือสิ่งที่คุณต้องการ คุณยังสามารถลอง Application.Exit () ได้ แต่ควรปิดใช้งานได้ คุณมีด้ายคนงานหรือไม่? หากเธรดที่ไม่ใช่พื้นหลังกำลังทำงานอยู่สิ่งนี้อาจทำให้แอปพลิเคชันเปิดอยู่



0

คุณยังสามารถทริกเกอร์รูปแบบอื่น ๆ

เช่นทริกเกอร์ปุ่มยกเลิกหากคุณแก้ไขคุณสมบัติ Form CancelButton และตั้งค่าปุ่มยกเลิก

ในรหัสที่คุณปฏิบัติต่อปุ่มยกเลิกดังต่อไปนี้เพื่อปิดแบบฟอร์ม:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.