2010-02-18 58 views
78

Tôi đã thử những điều sau đây:nút Escape để đóng Windows Forms hình thành trong C#

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 cố gắng 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ì của lao động.

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

+1

Bạn đã thử đặt điểm ngắt trong các phương pháp đó chưa? Người xử lý sự kiện có còn bắn không? –

+0

@SteveDanner, sự kiện không được kích hoạt. có lẽ khai báo trong InitializeComponent() là mất tích. –

+1

Đừng đặt tên 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. –

Trả lời

167

này sẽ luôn luôn làm việc, bất kể nhiệm vụ xử lý sự kiện thích hợp, KeyPreview, CancelButton vv:

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

cảm ơn bạn nhiều! đây chính xác là những gì tôi đang tìm kiếm !!! – yeahumok

+3

hoạt động như một nét duyên dáng –

+8

-1, sử dụng thuộc tính CancelButton của Biểu mẫu là cách chính xác. – ABCD

51

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

+1

Tôi đã làm điều đó nhưng nó không bị sa thải khi tôi nhấn esc, tại sao? –

+0

Điều này làm việc tuyệt vời cho tôi.Tốt hơn cho các hình thức nhỏ. – knut

15

Giả sử bạn có nút "Hủy", hãy đặt thuộc tính CancelButton của biểu mẫu (trong nhà thiết kế hoặc trong mã) nên tự động xử lý điều này. Chỉ cần đặt mã để đóng trong sự kiện Click của nút.

0

Bằng nút thoát 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 chuỗi công nhân? Nếu một luồng không phải là nền tảng đang chạy, điều này có thể giữ cho ứng dụng mở.

+0

Mọi bình luận từ downvoter? – SwDevMan81

5

Câu trả lời được chấp nhận thực tế là đúng, và tôi đã sử dụng mà tiếp cận nhiều lần. Đột nhiên, nó sẽ không hoạt động nữa, vì vậy tôi thấy nó lạ. Chủ yếu là vì điểm ngắt của tôi sẽ không bị trúng cho số ESC, nhưng nó sẽ nhấn 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ừ hình thức của tôi đã được trọng ProcessCmdKey phương pháp, 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 chặn hình thức của tôi từ nhận được ESC chính (hãy chú ý đến số return true). Vì vậy, hãy chắc chắn rằng không có điều khiển con nào đang chiếm lấy đầu vào của bạn.

+0

Tắt đầu của tôi, không chắc chắn nếu bạn cần phải thiết lập KeyPreview mẫu thành true - http://msdn.microsoft.com/en-us/library/system.windows.forms. form.keypreview (v = vs.110) .aspx – Andez

0

Bạn cần thêm mục 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 đặt KeyPreview thành true trong tùy chọn biểu mẫu và sau đó thêm sự kiện nhấn phím vào nó. 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.

Các vấn đề liên quan