Próbowałem następujących rzeczy:
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if ((Keys) e.KeyValue == Keys.Escape)
this.Close();
}
Ale to nie działa.
Potem spróbowałem tego:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.KeyCode == Keys.Escape)
this.Close();
}
I nadal nic nie działa.
KeyPreview we właściwościach formularza Windows Forms jest ustawiona na true ... Co robię źle?
Odpowiedzi:
To zawsze będzie działać niezależnie od prawidłowego przyporządkowania obsługi zdarzeń,
KeyPreview
,CancelButton
itp:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Escape) { this.Close(); return true; } return base.ProcessCmdKey(ref msg, keyData); }
źródło
true
z,ProcessCmdKey
aby zasygnalizować, że klucz jest zajęty, zapobiegając w ten sposób dźwiękowi „ding”.Powinieneś być w stanie ustawić właściwość formularza na
CancelButton
przycisk Anuluj, a wtedy nie będziesz potrzebować żadnego kodu.źródło
Zakładając, że masz przycisk „Anuluj”, ustawienie właściwości formularza
CancelButton
(w projektancie lub w kodzie) powinno zająć się tym automatycznie. Po prostu umieść kod do zamknięcia wClick
przypadku przycisku.źródło
Przyjęta odpowiedź jest rzeczywiście prawidłowa i kilkakrotnie użyłem tego podejścia. Nagle to już nie działało, więc wydało mi się to dziwne. Głównie dlatego, że mój punkt przerwania nie zostałby trafiony dla ESCklawisza, ale uderzyłby w inne klawisze.
Po debugowaniu stwierdziłem, że jedna z kontrolek z mojego formularza przesłaniała
ProcessCmdKey
metodę z tym kodem:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // ... if (keyData == (Keys.Escape)) { Close(); return true; } return base.ProcessCmdKey(ref msg, keyData); }
... i to uniemożliwiało mojemu formularzowi uzyskanie ESCklucza (zwróć uwagę na
return true
). Dlatego upewnij się, że żadne elementy sterujące podrzędne nie przejmują danych wejściowych.źródło
Ustawiasz KeyPreview na true w opcjach formularza, a następnie dodajesz do niego zdarzenie Keypress. W zdarzeniu naciśnięcia klawisza wpisz:
private void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 27) { Close(); } }
key.Char == 27
to wartość ucieczki w kodzie ASCII.źródło
Przez przycisk Escape masz na myśli klawisz Escape? Sądząc po twoim kodzie, myślę, że tego chcesz. Możesz także spróbować Application.Exit (), ale Close powinno działać. Czy masz wątek roboczy? Jeśli działa wątek niebędący w tle, może to spowodować, że aplikacja będzie otwarta.
źródło
Musisz dodać to do zdarzenia „KeyUp”.
private void Form1_KeyUp(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Escape) { this.Close(); } }
źródło
Możesz także aktywować inną formę.
Np. Wyzwalaj przycisk Anuluj, jeśli edytujesz właściwość CancelButton formularza i ustawisz przycisk Anuluj.
W kodzie traktujesz przycisk Anuluj w następujący sposób, aby zamknąć formularz:
private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Abort; }
źródło