Saya telah mencoba yang berikut ini:
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if ((Keys) e.KeyValue == Keys.Escape)
this.Close();
}
Tapi itu tidak berhasil.
Kemudian saya mencoba ini:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.KeyCode == Keys.Escape)
this.Close();
}
Dan masih tidak ada yang berhasil.
KeyPreview pada properti formulir Windows saya disetel ke true ... Apa yang saya lakukan salah?
Jawaban:
Hal ini akan selalu bekerja, terlepas dari tugas event yang tepat,
KeyPreview
,CancelButton
, dll:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Escape) { this.Close(); return true; } return base.ProcessCmdKey(ref msg, keyData); }
sumber
true
dariProcessCmdKey
ke sinyal bahwa kunci tersebut ditangani, sehingga mencegah derau "ding".Anda hanya dapat mengatur
CancelButton
properti Formulir ke tombol Batal dan kemudian Anda tidak memerlukan kode apa pun.sumber
Dengan asumsi bahwa Anda memiliki tombol "Batal", pengaturan
CancelButton
properti formulir (baik dalam perancang atau dalam kode) akan menangani ini secara otomatis. Cukup tempatkan kode untuk menutupClick
jika ada tombol.sumber
Jawaban yang diterima memang benar, dan saya telah menggunakan pendekatan itu beberapa kali. Tiba-tiba, itu tidak berfungsi lagi, jadi saya merasa aneh. Sebagian besar karena breakpoint saya tidak akan mengenai ESCkunci, tetapi akan mengenai kunci lain.
Setelah debugging saya menemukan bahwa salah satu kontrol dari formulir saya adalah
ProcessCmdKey
metode overriding , dengan kode ini:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // ... if (keyData == (Keys.Escape)) { Close(); return true; } return base.ProcessCmdKey(ref msg, keyData); }
... dan ini mencegah formulir saya mendapatkan ESCkunci (perhatikan
return true
). Jadi pastikan tidak ada kontrol anak yang mengambil alih masukan Anda.sumber
Anda menyetel KeyPreview ke true dalam opsi formulir Anda dan kemudian Anda menambahkan acara Keypress ke dalamnya. Dalam acara penekanan tombol Anda, Anda mengetik yang berikut:
private void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 27) { Close(); } }
key.Char == 27
adalah nilai escape dalam kode ASCII.sumber
Yang Anda maksud dengan tombol Escape adalah tombol Escape? Menilai dari kode Anda, saya pikir itulah yang Anda inginkan. Anda juga dapat mencoba Application.Exit (), tetapi Close seharusnya berfungsi. Apakah Anda memiliki utas pekerja? Jika thread non-latar belakang sedang berjalan, ini dapat membuat aplikasi tetap terbuka.
sumber
Anda perlu menambahkan ini ke acara "KeyUp".
private void Form1_KeyUp(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Escape) { this.Close(); } }
sumber
Anda juga dapat Memicu beberapa bentuk lain.
Misalnya memicu tombol Batal jika Anda mengedit properti Formulir CancelButton dan mengatur tombol Batal.
Dalam kode Anda memperlakukan Tombol Batal sebagai berikut untuk menutup formulir:
private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Abort; }
sumber