Reagieren auf Tastaturereignisse

Tastaturereignisse sind zusammen mit Mausereignissen die primären Elemente der Interaktion eines Benutzers mit Ihrem Programm. Durch Klicken und Drücken von Tasten werden Ereignisse ausgelöst, die dem Benutzer Dateneingabe und grundlegende Navigation durch Fenster und Menüs ermöglichen.

Das Programmieren Ihrer Anwendung, um auf Tastenereignisse zu reagieren wird als Schreiben einer Behandlungsroutine für die Tastatur bezeichnet. Eine Behandlungsroutine für die Tastatur kann auf zwei Ebenen funk­tionieren: auf der Steuerelementebene und auf der Formularebene. Die Behandlungsroutine für die Steuerelementebene (untere Ebene) ermöglicht Ihnen das Programmieren eines bestimmten Steuerelements. Sie beabsichtigen beispielsweise, den gesamten Text, der in ein Textfeld-Steuerelement eingegeben wurde, in Großbuchstaben umzuwandeln. Eine Behandlungsroutine auf Formularebene ermöglicht es Ihnen, zunächst auf die Tastenereignisse zu reagieren. Der Fokus kann dann auf das Steuerelement oder die Steuerelemente in dem Formular gesetzt werden, und die Ereignisse können entweder wiederholt oder ausgelöst werden.

Schreiben von Tastaturbehandlungsroutinen der niedrigen Ebene

Visual Basic stellt drei Ereignisse bereit, die von Formularen und von allen Steuerelementen, die Eingaben über die Tastatur akzeptieren, erkannt werden. Diese werden in der folgenden Tabelle beschrieben.

Tastaturereignis

Tritt auf

KeyPress

wenn eine Taste gedrückt wird, die einem ASCII-Zeichen entspricht.

KeyDown

wenn eine beliebige Taste auf der Tastatur gedrückt wird.

KeyUp

wenn eine beliebige Taste auf der Tastatur losgelassen wird.

Nur das Objekt, auf dem sich der Fokus befindet, kann auf ein Tastaturereignis reagieren. Bei Tastaturereignissen befindet sich der Fokus nur dann auf einem Formular, wenn es aktiv ist und kein Steuerelement in diesem Formular den Fokus hat. Dies ist nur bei leeren Formularen und solchen Formularen der Fall, in denen alle Steuerelemente deaktiviert wurden. Wenn Sie jedoch die KeyPreview-Eigenschaft in einem Formular auf True gesetzt haben, erhält das Formular alle Tastaturereignisse für jedes Steuerelement in dem Formular, bevor das Steuerelement diese erkennt. Dies ist dann nützlich, wenn immer dann die gleiche Aktion durchgeführt werden soll, wenn eine bestimmte Taste gedrückt wird. Dabei spielt es keine Rolle, in welchem Steuerelement sich der Fokus zu diesem Zeitpunkt befindet.

Die Ereignisse KeyDown und KeyUp ermöglichen eine Tastaturreaktion auf der niedrigsten Ebene. Verwenden Sie diese Ereignisse, um eine Bedingung zu ermitteln, die das KeyPress-Ereignis beispielsweise nicht ermitteln kann:

ˇ     Spezielle Kombinationen der Tasten UMSCHALT, STRG und ALT.

ˇ     Pfeiltasten. Beachten Sie, daß einige Steuerelemente (Befehlsschaltflächen, Optionsfelder und Kontrollkästchen) keine Pfeiltastenereignisse erhalten: Die Pfeiltasten bewirken statt dessen eine Verschiebung zu einem anderen Steuerelement.

ˇ     BILD-NACH-OBEN und BILD-NACH-UNTEN.

ˇ     Unterscheiden des numerischen Tastenblocks von den Zahlen auf der Tastatur.

ˇ     Reagieren auf eine Taste, die sowohl losgelassen als auch gedrückt wird (das KeyPress-Ereignis reagiert nur auf eine Taste, die gedrückt wird).

ˇ     Funktionstasten, die nicht mit Menübefehlen verknüpft wurden.

Die Tastaturereignisse schließen sich nicht gegenseitig aus. Wenn der Benutzer eine Taste drückt, werden die Ereignisse KeyDown und KeyPress generiert, gefolgt von einem KeyUp-Ereignis, wenn die Taste losgelassen wird. Wird eine der Tasten gedrückt, die das KeyPress-Ereignis nicht erkennt, tritt nur ein KeyDown-Ereignis gefolgt von einem KeyUp-Ereignis auf.

Bevor Sie die Ereignisse KeyUp und KeyDown verwenden, sollten Sie sicherstellen, daß das KeyPress-Ereignis nicht ausreicht. Dieses Ereignis ermittelt Tasten, die mit allen Standard-ASCII-Zeichen übereinstimmen: Buchstaben, Ziffern und Satzzeichen auf der Tastatur sowie EINGABETASTE, TABULATORTASTE und RÜCKTASTE. In der Regel ist das Schreiben von Code für das KeyPress-Ereignis leichter.

Anmerkung   Der ANSI-Zeichensatz (ANSI = American National Standards Institute) von Windows enthält 256 Zeichen, die das lateinische Alphabet, Sonderzeichen sowie viele Buchstaben mit Akzent und Umlaute enthalten. Diese Zeichen werden durch einen eindeutigen numerischen 1-Byte-Wert dargestellt (0-255). ASCII (American Standard Code for Information Interchange) ist im wesentlichen ein dem ANSI-Zeichensatz untergeordneter Zeichensatz (0-127) und stellt die Standardbuchstaben, -ziffern und -satzzeichen auf der Tastatur dar. Die beiden Zeichensätze werden häufig als austauschbar angesehen.

Das KeyPress-Ereignis

Das KeyPress-Ereignis tritt auf, wenn eine beliebige Taste gedrückt wird, die mit einem ASCII-Zeichen überein­stimmt. Der ASCII-Zeichensatz stellt nicht nur Buchstaben, Ziffern und Satzzeichen auf der Standardtastatur dar, sondern auch die meisten der Steuerungstasten. Das KeyPress-Ereignis erkennt jedoch nur die EINGABETASTE, die TABULATORTASTE und die RÜCKTASTE. Die anderen Funktionstasten, die Bearbeiten-Tasten, und die Tasten zum Navigieren können von den Ereignissen KeyDown und KeyUp gefunden werden.

Verwenden Sie das KeyPress-Ereignis immer dann, wenn die Standard-ASCII-Zeichen verarbeitet werden sollen. Wenn beispielsweise alle Zeichen in einem Textfeld als Großbuchstaben dargestellt werden sollen, können Sie dieses Ereignis zur Änderung der Groß-/Kleinschreibung verwenden, während die Zeichen eingegeben werden:

Private Sub Text1_KeyPress (KeyAscii As Integer)

   KeyAscii = Asc(UCase(Chr(KeyAscii)))

End Sub

Das keyascii-Argument gibt einen Wert vom Typ Integer zurück, der mit einem ASCII-Zeichensatz übereinstimmt. Der obige Code verwendet Chr, um den ASCII-Zeichensatz ins entsprechende Zeichen zu konvertieren, UCase, um das Zeichen in Großbuchstaben umzuwandeln, Asc, um dieses Ergebnis in eine Zahl umzuwandeln.

Durch Verwenden der gleichen ASCII-Zeichen-Codes können Sie testen, ob eine vom KeyPress-Ereignis erkannte Taste gedrückt wird. Die folgende Ereignisprozedur verwendet beispielsweise das KeyPress-Ereignis, um festzustellen, ob der Benutzer die RÜCKTASTE drückt:

Private Sub Text1_KeyPress (KeyAscii As Integer)

   If KeyAscii = 8 Then MsgBox "Sie haben die RÜCKTASTE gedrückt."

End Sub

Sie können auch die Taste-Code-Konstanten von Visual Basic anstelle der Zeichen-Codes verwenden. Die RÜCKTASTE in obigem Beispiel hat den ASCII-Wert 8. Der Konstantenwert für die RÜCKTASTE ist vbKeyBack.

Weitere Informationen   Auf den nächsten Seiten finden Sie eine vollständige Liste der Zeichen-Codes und der Tasten-Code-Konstanten mit den entsprechenden ASCII-Werten.

Sie können auch das KeyPress-Ereignis verwenden, um das Standardverhalten bestimmter Tasten zu ändern. Wenn Sie beispielsweise die EINGABETASTE drücken, und das Formular enthält keine Standard-Schaltfläche, wird ein Signalton erzeugt. Sie können diesen Signalton verhindern, indem Sie die EINGABETASTE (Zeichen-Code 13) im KeyPress-Ereignis abfangen.

Private Sub Text1_KeyPress (KeyAscii As Integer)

   If KeyAscii = 13 Then KeyAscii = 0

End Sub

Die Ereignisse KeyDown und KeyUp

Die Ereignisse KeyUp und KeyDown leiten den genauen physischen Status der Tastatur weiter. Eine Taste wird gedrückt (KeyDown), und eine Taste wird losgelassen (KeyUp). Im Gegensatz dazu gibt das KeyPress-Ereignis den Status der Tastatur nicht direkt weiter - es erkennt nicht, ob die Taste gedrückt oder losgelassen wurde, sondern gibt lediglich das Zeichen weiter, das die Taste darstellt.

In einem weiteren Beispiel soll dieser Unterschied verdeutlicht werden. Wenn der Benutzer den Großbuchstaben "A" eingibt, erhält das KeyDown-Ereignis den ASCII-Code für "A". Das KeyDown-Ereignis erhält den gleichen Code, wenn der Benutzer den Kleinbuchstaben "a" eingibt. Um festzustellen, ob das eingegebene Zeichen ein Groß- oder Kleinbuchstabe ist, verwenden diese Ereignisse das shift-Argument. Im Gegensatz dazu behandelt das KeyPress-Ereignis die groß- und kleingeschriebene Version eines Buchstabens als zwei getrennte ASCII-Zeichen.

Die Ereignisse KeyDown und KeyUp geben mit Hilfe der folgenden beiden Argumente Informationen zu dem eingegebenen Zeichen zurück.

Argument

Beschreibung

keycode

Zeigt die physisch gedrückte Taste an. In diesem Fall werden "A" und "a" als gleicher Buchstabe zurückgegeben. Die beiden Buchstaben haben den gleichen keycode-Wert. Beachten Sie aber, dass "1" auf der Schreibmaschinentastatur und "1" auf dem numerischen Tastenblock als unterschiedliche Tasten zurückgegeben werden, auch wenn sie das gleiche Zeichen generieren.

shift

Gibt den Status der Tasten UMSCHALT, STRG und ALT an. Nur mit Hilfe dieses Arguments können Sie feststellen, ob ein Groß- oder ein Kleinbuchstabe gedrückt wurde.

Das Keycode-Argument

Das keycode-Argument identifiziert eine Taste nach ihrem ASCII-Wert oder nach ihrer Konstante für den Tasten-Code. Die Tasten-Codes für Buchstabentasten entsprechen den ASCII-Codes des Buchstabens in Großschreibung. Der keycode für "A" und "a" ist der von Asc("A") zurückgegebene Wert. Im folgenden Beispiel wird mit Hilfe des KeyDown-Ereignisses festgestellt, ob die Taste "A" gedrückt wurde:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   If KeyCode = vbKeyA Then MsgBox "Sie haben die Taste A gedrückt."

End Sub

Wenn UMSCHALT + "A" oder "A" ohne die UMSCHALTTASTE gedrückt werden, wird ein Meldungsfeld angezeigt - d.h., das Argument ist in jedem Fall wahr. Um festzustellen, ob der Großbuchstabe oder der Kleinbuchstabe gedrückt wurde, müssen Sie das shift-Argument verwenden (siehe unten im Abschnitt "Das "Shift"-Argument").

Tasten-Codes für die Zahlen- und Zeichensetzungstasten entsprechen dem ASCII-Code der Zahl auf der Taste. Der keycode für "1" und "!" ist der Wert, der von Asc("1") zurückgegeben wird. Um im Hinblick auf das Zeichen "!" zu testen, müssen Sie das shift-Argument verwenden.

Die Ereignisse KeyDown und KeyUp können die meisten der Steuerungstasten auf einer Standardtastatur erkennen. Dazu gehören die Funktionstasten (F1-F16), die Bearbeitungstasten (POS1, BILD-NACH-OBEN, ENTF etc.), die Navigationstasten (NACH-RECHTS, NACH-LINKS, NACH-OBEN und NACH-UNTEN) und der numerische Tastenblock. Diese Tasten können getestet werden, indem entweder die Konstante für den Tasten-Code oder der entsprechende ASCII-Wert verwendet wird. Ein Beispiel:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   If KeyCode = vbKeyHome Then MsgBox "Sie haben die Taste POS1 gedrückt."

End Sub

Das "Shift"-Argument

Die Tastenereignisse verwenden das shift-Argument auf die gleiche Weise wie Mausereignisse das Argument verwenden - als Ganzzahl und Konstantenwerte, die für die Tasten UMSCHALT, STRG und ALT stehen. Sie können das shift-Argument mit den Ereignissen KeyDown und KeyUp verwenden, um zwischen Großbuchstaben und Kleinbuchstaben zu unterscheiden oder um unterschiedliche Zustände der Maus herauszufinden.

Sie können mit Hilfe des shift-Arguments feststellen, ob ein Großbuchstabe gedrückt wurde.

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   If KeyCode = vbKeyA And Shift = 1 Then MsgBox "Sie haben den Großbuchstaben A gedrückt."

End Sub

Wie bei Mausereignissen können die Ereignisse KeyUp und KeyDown die Tasten UMSCHALT, STRG und ALT einzeln oder in Kombinationen erkennen. Im folgenden Beispiel wird der Zustand der UMSCHALTTASTE getestet.

Öffnen Sie ein neues Projekt, und fügen Sie die Variable ShiftKey dem Deklarationsabschnitt hinzu:

Dim ShiftKey as Integer

Fügen Sie im Formular ein Textfeld-Steuerelement ein und die folgende Prozedur dem KeyDown-Ereignis hinzu:

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)

   ShiftKey = Shift And 7

   Select Case ShiftKey

      Case 1 ' oder vbShiftMask

        Print "Sie haben die UMSCHALTTASTE gedrückt."

      Case 2 ' oder vbCtrlMask

        Print "Sie haben die STRG-TASTE gedrückt."

      Case 4 ' oder vbAltMask

        Print "Sie haben die ALT-TASTE gedrückt."

      Case 3

        Print "Sie haben UMSCHALT und STRG gedrückt."

      Case 5

        Print "Sie haben UMSCHALT und ALT gedrückt."

      Case 6

        Print "Sie haben STRG und ALT gedrückt."

      Case 7

        Print "Sie haben UMSCHALT, STRG und ALT gedrückt."

      End Select

End Sub

Solange das Textfeld-Steuerelement (Textbox) den Fokus hat, gibt jede Kombination von Tasten, die gedrückt wird, eine entsprechende Meldung auf dem Formular aus.

Schreiben von Tastaturbehandlungsroutinen auf Formularebene

Jedes KeyDown- und KeyUp-Ereignis wird mit einem bestimmten Objekt verknüpft. Um eine Tastaturbehandlungsroutine zu schreiben, die für alle Objekte in dem Formular gilt, setzen Sie die KeyPreview-Eigenschaft auf True. Wenn die KeyPreview-Eigenschaft auf True gesetzt wurde, erkennt das Formular die Ereignisse KeyPress, KeyUp und KeyDown für alle Steuerelemente in dem Formular, bevor die Steuer­elemente selbst die Ereignisse erkennen. Auf diese Weise kann leichter eine zusammenhängende Reaktion auf einen bestimmten Tasten­anschlag oder eine Tastenkombination erfolgen.

Sie können die KeyPreview-Eigenschaft im Eigenschaftenfenster oder über den Code in der Form_Load-Prozedur auf True setzen:

Private Sub Form_Load

   Form1.KeyPreview = True

End Sub

Sie können einen Test im Hinblick auf die unterschiedlichen Tastenzustände in einem Formular durchführen, indem Sie eine ShiftKey-Variable deklarieren und die Select Case-Anweisung verwenden. Mit Hilfe des folgenden Verfahrens wird die Meldung im Formular ausgegeben, wobei es keine Rolle spielt, welches Steuerelement den Fokus besitzt.

Öffnen Sie ein neues Projekt, und fügen Sie die Variable ShiftKey zum Deklarationsabschnitt des Formulars hinzu:

Dim ShiftKey as Integer

Fügen Sie ein Textfeld-Steuerelement (TextBox) und ein Befehlsschaltfläche-Steuerelement (CommandButton) zum Formular hinzu. Fügen Sie anschließend die folgende Prozedur ins KeyDown-Ereignis des Formulars ein:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

   ShiftKey = Shift And 7

   Select Case ShiftKey

      Case 1 ' oder vbShiftMask

        Print "Sie haben die UMSCHALTTASTE gedrückt."

      Case 2 ' oder vbCtrlMask

        Print "Sie haben die STRG-TASTE gedrückt."

      Case 4 ' oder vbAltMask

         Print "Sie haben die ALT-TASTE gedrückt."

   End Select

End Sub

Wenn Sie eine Tastenkombination für ein Menü-Steuerelement definiert haben, tritt das Click-Ereignis für dieses Menü-Steuerelement automatisch ein, wenn der Benutzer diese Taste drückt; ein Tasten-Ereignis wird nicht ausgelöst.

Ebenso bewirkt die EINGABETASTE, sofern das Formular eine Befehlsschaltfläche enthält, deren Default-Eigenschaft auf True gesetzt ist, dass anstelle eines Tasten­ereignisses das Click-Ereignis für diese Befehlsschaltfläche ausgelöst wird. Falls eine Befehlsschaltfläche vorhanden ist, deren Cancel-Eigenschaft auf True gesetzt ist, bewirkt die ESC-TASTE, daß anstelle eines Tastenereignisses das Click-Ereignis für diese Befehlsschaltfläche eintritt.

Wenn Sie beispielsweise eine Click-Ereignisprozedur zum Befehlsschaltfläche-Steuerelement (CommandButton) hinzufügen und dann entweder die Default- oder die Cancel-Eigenschaft auf True setzen, wird durch Drücken der EINGABE- oder der ESC-TASTE das KeyDown-Ereignis übergangen. Die folgende Prozedur schließt die Anwendung:

Private Sub Command1_Click()

   End

End Sub

Beachten Sie, daß mit der TABULATORTASTE der Fokus von Steuerelement zu Steuer­element verschoben und kein Tastenereignis ausgelöst wird, wenn nicht alle Steuer­elemente in dem Formular deaktiviert sind oder TabStop auf False gesetzt wurde.

Wenn die KeyPreview-Eigenschaft des Formulars auf True gesetzt wurde, erkennt das Formular die Tastaturereignisse vor den Steuer­elementen; die Ereignisse treten jedoch weiterhin für die Steuerelemente ein. Um dies zu verhindern, können Sie die Argumente keyascii oder keycode in den Schlüsselereignisprozeduren auf 0 setzen. Wenn das Formular beispielsweise keine Standardschaltfläche enthält, können Sie mit Hilfe der EINGABETASTE den Fokus von Steuerelement zu Steuerelement verschieben:

Private Sub Form_KeyPress (KeyAscii As Integer)

Dim NextTabIndex As Integer, i As Integer

   If KeyAscii = 13 Then

      If Screen.ActiveControl.TabIndex = Count - 1 Then

        NextTabIndex = 0

      Else

        NextTabIndex = Screen.ActiveControl.TabIndex + 1

      End If

      For i = 0 To Count - 1

        If Me.Controls(i).TabIndex = NextTabIndex Then

           Me.Controls(i).SetFocus

           Exit For

        End If

      Next i

      KeyAscii = 0

   End If

End Sub

Da dieser Code keyascii auf 0 setzt, wenn keyascii den Wert 13 erreicht, erkennen die Steuerelemente nie, ob die EINGABETASTE gedrückt wird, und ihre Schlüsselereignisprozeduren werden nie aufgerufen.