OnKeyDown() - geht nicht immer so wie erwartet


Thomas Wölfer
Thomas Wölfer

01. August 2004


Ich bin sicherlich nicht der einzige der gerne hätte, das die selbst programmierten Dialogboxen geschlossen werden, wenn die Dialogbox gerade Focus hat und Escape gedrückt wird: Das ist das Verhalten, was jedermann bei einer Dialogbox erwarten würde.

Windows.Forms hat dafür Eventhandler, in denen man sich ums schließen kümmern kann: Dabei gibt es drei Handler, von denen der fürs KeyDown-Event der 'offensichtliche' ist. Nur wird der leider nie aufgerufen - und kann daher für den geschilderten Fall auch nicht verwendet werden.

Der KeyDown Event tritt nämlich ein nachdem eine Taste gedrückt wurde und zwar beim Control das gerade Fokus hat.

Die Form sieht dieses Event also NIE. (Bin gerne bereit mich belehren zu lassen, denn vielleicht gibt es schon einen Fall bei dem das Event eintritt, im Normalfall tut es das jedenfalls nicht. Es wäre natürlich schön, wenn das in der Dokumentation irgendwo stehen würden. :-( ) Mit anderen Worten: Um eine Dialogbox per ESC schließen zu können, ist KeyDown das falsche Ereignis.

Statt dessen macht man folgendes: Man überlädt ProcessDialogKey. Zum Beispiel so:

protected override bool ProcessDialogKey(Keys keyData)
{
   if (keyData == Keys
.Escape)
   {
      this
.Close();
      return true
;
   }
   return base
.ProcessDialogKey(keyData);
}

Noch kurz was anderes: Ich baue mitlerweile alle meine Testprojekte mit Visual C# 2005 Express (Beta). Bin wirklich begeistert.