Nút Escape để đóng biểu mẫu Windows Forms trong C #


91

Tôi đã thử những cách sau:

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

Nhưng nó không hoạt động.

Sau đó, tôi đã thử điều này:

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

Và vẫn không có gì hoạt động.

KeyPreview trên thuộc tính biểu mẫu Windows Forms của tôi được đặt thành true ... Tôi đang làm gì sai?


1
Bạn đã thử đặt breakpoint trong các phương pháp đó chưa? Trình xử lý sự kiện có đang kích hoạt không?
Steve Danner

1
Đừng đặt tên cho nút hủy của bạn như thuộc tính biểu mẫu 'CancelButton'. Nếu không, có vẻ như bạn không thể đặt CancelButton.
Jonas Middendorf

@SteveDanner, sự kiện không được kích hoạt. có thể khai báo trong InitializeComponent () bị thiếu.
InfantPro'Aravind '

Tôi nghĩ rằng lý do nó không hoạt động là vì các điều khiển khác bên trong biểu mẫu đã lấy tiêu điểm ...
itho

Câu trả lời:


199

Điều này sẽ luôn hoạt động, bất kể chỉ định trình xử lý sự kiện thích hợp, KeyPreview, CancelButton, v.v.:

    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, sử dụng thuộc tính CancelButton của Biểu mẫu là cách chính xác.
ABCD

14
Ugh, những năm 1980 đã gọi, họ muốn hộp thoại của họ trở lại.
Hans Passant

1
Bạn cũng có thể quay lại truetừ đó ProcessCmdKeyđể báo hiệu rằng phím đã được xử lý, do đó ngăn chặn tiếng ồn "ding".
Spooky

8
Bạn chỉ có thể sử dụng thuộc tính CancelButton của biểu mẫu nếu biểu mẫu có một Nút thực trên đó (hoặc một đối tượng giao diện IButtonControl).
David

3
Tùy chọn này là tốt. CancelButton yêu cầu thêm nút 'Hủy bỏ' có thể nhìn thấy trên biểu mẫu. Đây là kết xuất dư thừa + mã + v.v.
V319

64

Bạn chỉ có thể đặt thuộc tính của Biểu mẫu CancelButtonthành nút Hủy và sau đó bạn sẽ không cần bất kỳ mã nào.


2
Tôi đã làm điều đó nhưng nó không bị bắn khi tôi nhấn esc, tại sao?
Mihai Bratulescu

Nó hiệu quả tuyệt vời đối với tôi. Tốt hơn nhiều cho các hình thức nhỏ.
knut

15

Giả sử rằng bạn có nút "Hủy", việc đặt thuộc tính của biểu mẫu CancelButton(trong trình thiết kế hoặc trong mã) sẽ tự động xử lý việc này. Chỉ cần đặt mã để đóng trong trường Clickhợp có nút.


9

Câu trả lời được chấp nhận thực sự là đúng, và tôi đã sử dụng cách tiếp cận đó vài lần. Đột nhiên, nó sẽ không hoạt động nữa, vì vậy tôi thấy nó là lạ. Chủ yếu là vì điểm ngắt của tôi sẽ không được đánh cho ESCphím chính, nhưng nó sẽ đánh cho các phím khác.

Sau khi gỡ lỗi, tôi phát hiện ra rằng một trong những điều khiển từ biểu mẫu của tôi là ProcessCmdKeyphương thức ghi đè , với mã này:

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

... và điều này đã ngăn biểu mẫu của tôi nhận được ESCchìa khóa (lưu ý return true). Vì vậy, hãy đảm bảo rằng không có kiểm soát trẻ em nào tiếp quản đầu vào của bạn.


Tôi không biết bạn có cần đặt biểu mẫu KeyPreview thành true không - msdn.microsoft.com/en-us/library/…
Andez

Có vẻ như tôi đang gặp phải sự cố này với các điều khiển ListView trên biểu mẫu win của mình. Tôi tự hỏi liệu đó có phải là ListView nơi bạn cũng gặp sự cố không?
raddevus

1

Bạn đặt KeyPreview thành true trong các tùy chọn biểu mẫu của mình và sau đó bạn thêm sự kiện Keypress vào đó. Trong sự kiện nhấn phím của bạn, bạn nhập như sau:

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

key.Char == 27 là giá trị thoát trong mã ASCII.


Đây là một giải pháp tốt cho vấn đề này. Tôi có một biểu mẫu với các điều khiển ListView trên đó và trong trường hợp đó, chúng dường như nuốt CancelButton (khi Esc được nhấn). Tôi đã thêm mã này và nó đã khắc phục sự cố.
raddevus

0

Nút Escape có nghĩa là phím Escape? Đánh giá bằng mã của bạn, tôi nghĩ đó là những gì bạn muốn. Bạn cũng có thể thử Application.Exit (), nhưng Close sẽ hoạt động. Bạn có một chủ đề công nhân? Nếu một chuỗi không phải nền đang chạy, điều này có thể giữ cho ứng dụng luôn mở.


0

Bạn cần thêm cái này vào sự kiện "KeyUp".

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

0

Bạn cũng có thể kích hoạt một số hình thức khác.

Ví dụ: kích hoạt Nút Hủy nếu bạn chỉnh sửa thuộc tính Biểu mẫu CancelButton và đặt nút Hủy.

Trong đoạn mã, bạn nhấn nút Hủy như sau để đóng biểu mẫu:

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.