Informationen zu Tastaturbeschleunigungen
Accelerators sind eng mit Menüs verknüpft – beide bieten dem Benutzer Zugriff auf den Befehlssatz einer Anwendung. In der Regel verlassen sich Benutzer auf die Menüs einer Anwendung, um den Befehlssatz zu erlernen und dann zur Verwendung von Beschleunigern zu wechseln, wenn sie mit der Anwendung vertrauter werden. Accelerators bieten schnelleren, direkteren Zugriff auf Befehle als Menüs. Mindestens sollte eine Anwendung Accelerators für die am häufigsten verwendeten Befehle bereitstellen. Obwohl Beschleuniger in der Regel Befehle generieren, die als Menüelemente vorhanden sind, können sie auch Befehle generieren, die keine entsprechenden Menüelemente enthalten.
In diesem Abschnitt werden die folgenden Themen behandelt.
- Acceleratortabellen
- Accelerator-Table-Erstellung
- Tastenkombinationszuweisungen
- Beschleuniger und Menüs
- Benutzeroberflächenstatus
Acceleratortabellen
Eine Acceleratortabelle besteht aus einem Array von ACCEL-Strukturen , die jeweils einen individuellen Accelerator definieren. Jede ACCEL-Struktur enthält die folgenden Informationen:
- Die Tastenkombination des Beschleunigers.
- Der Bezeichner des Accelerators.
- Verschiedene Flags. Dies schließt eine ein, die angibt, ob das System visuelles Feedback geben soll, indem das entsprechende Menüelement (falls vorhanden) hervorgehoben wird, wenn der Accelerator verwendet wird.
Zum Verarbeiten von Tastenkombinationen für einen angegebenen Thread muss der Entwickler die TranslateAccelerator-Funktion in der Nachrichtenschleife aufrufen, die der Nachrichtenwarteschlange des Threads zugeordnet ist. Die TranslateAccelerator-Funktion überwacht die Tastatureingabe in der Nachrichtenwarteschlange und sucht nach Tastenkombinationen, die einem Eintrag in der Accelerator-Tabelle entsprechen. Wenn TranslateAccelerator eine Übereinstimmung findet, übersetzt er die Tastatureingabe (d. h. die WM_KEYUP und WM_KEYDOWN Nachrichten) in eine WM_COMMAND - oder WM_SYSCOMMAND-Nachricht und sendet die Nachricht dann an die Fensterprozedur des angegebenen Fensters. Die folgende Abbildung zeigt, wie Beschleuniger verarbeitet werden.
Die WM_COMMAND Nachricht enthält den Bezeichner des Accelerators, durch den TranslateAccelerator die Nachricht generiert hat. Die Fensterprozedur untersucht den Bezeichner, um die Quelle der Nachricht zu ermitteln, und verarbeitet die Nachricht dann entsprechend.
Acceleratortabellen sind auf zwei verschiedenen Ebenen vorhanden. Das System verwaltet eine einzelne, systemweite Acceleratortabelle, die für alle Anwendungen gilt. Eine Anwendung kann die Systembeschleunigertabelle nicht ändern. Eine Beschreibung der von der Systembeschleunigungstabelle bereitgestellten Beschleuniger finden Sie unter Tastenkombinationszuweisungen für Die Beschleunigung.
Das System verwaltet auch Acceleratortabellen für jede Anwendung. Eine Anwendung kann eine beliebige Anzahl von Acceleratortabellen für die Verwendung mit eigenen Fenstern definieren. Ein eindeutiges 32-Bit-Handle (HACCEL) identifiziert jede Tabelle. Für einen angegebenen Thread kann jedoch jeweils nur eine Acceleratortabelle aktiv sein. Das An die TranslateAccelerator-Funktion übergebene Handle an die Acceleratortabelle bestimmt, welche Acceleratortabelle für einen Thread aktiv ist. Die aktive Acceleratortabelle kann jederzeit geändert werden, indem ein anderes Acceleratortabellenhandle an TranslateAccelerator übergeben wird.
Accelerator-Table Erstellung
Zum Erstellen einer Acceleratortabelle für eine Anwendung sind mehrere Schritte erforderlich. Zunächst wird ein Ressourcencompiler verwendet, um Acceleratortabellenressourcen zu erstellen und sie der ausführbaren Datei der Anwendung hinzuzufügen. Zur Laufzeit wird die LoadAccelerators-Funktion verwendet, um die Acceleratortabelle in den Arbeitsspeicher zu laden und das Handle in die Acceleratortabelle abzurufen. Dieses Handle wird an die TranslateAccelerator-Funktion übergeben, um die Acceleratortabelle zu aktivieren.
Eine Acceleratortabelle kann auch zur Laufzeit für eine Anwendung erstellt werden, indem ein Array von ACCEL-Strukturen an die CreateAcceleratorTable-Funktion übergeben wird. Diese Methode unterstützt benutzerdefinierte Beschleuniger in der Anwendung. Wie die LoadAccelerators-Funktion gibt CreateAcceleratorTable ein Beschleunigertabellenhandle zurück, das an TranslateAccelerator übergeben werden kann, um die Acceleratortabelle zu aktivieren.
Das System zerstört automatisch Beschleunigertabellen, die von LoadAccelerators geladen oder von CreateAcceleratorTable erstellt wurden. Eine Anwendung kann jedoch Ressourcen freigeben, während sie ausgeführt wird, indem sie nicht mehr benötigte Acceleratortabellen zerstört, indem die DestroyAcceleratorTable-Funktion aufgerufen wird.
Eine vorhandene Acceleratortabelle kann kopiert und geändert werden. Die vorhandene Acceleratortabelle wird mithilfe der CopyAcceleratorTable-Funktion kopiert. Nachdem die Kopie geändert wurde, wird ein Handle für die neue Acceleratortabelle abgerufen, indem CreateAcceleratorTable aufgerufen wird. Schließlich wird das Handle an TranslateAccelerator übergeben, um die neue Tabelle zu aktivieren.
Tastenkombinationszuweisungen
Ein ASCII-Zeichencode oder ein Virtueller Schlüsselcode kann verwendet werden, um den Accelerator zu definieren. Bei einem ASCII-Zeichencode wird die Groß-/Kleinschreibung beachtet. Daher definiert die Verwendung des ASCII-Zeichens "C" den Accelerator als ALT+C und nicht als ALT+c. Bei der Verwendung von Beschleunigern, bei der die Groß-/Kleinschreibung beachtet wird, kann die Verwendung jedoch verwirrend sein. Beispielsweise wird der ALT+C-Beschleuniger generiert, wenn die CAPS-LOCK-TASTE ausgefallen ist oder wenn die UMSCHALTTASTE ausgefallen ist, aber nicht, wenn beide ausgefallen sind.
Bei Beschleunigern muss in der Regel die Groß-/Kleinschreibung nicht beachtet werden, sodass die meisten Anwendungen virtuelle Schlüsselcodes für Beschleuniger anstelle von ASCII-Zeichencodes verwenden.
Vermeiden Sie Beschleuniger, die mit der Menü-Mnemonics einer Anwendung in Konflikt geraten, da der Accelerator das Mnemonic außer Kraft setzt, was den Benutzer verwirren kann. Weitere Informationen zur Menü-Mnemonics finden Sie unter Menüs.
Wenn eine Anwendung einen Accelerator definiert, der auch in der Tabelle "Systembeschleunigung" definiert ist, überschreibt der anwendungsdefinierte Beschleuniger den Systembeschleuniger, jedoch nur innerhalb des Kontexts der Anwendung. Vermeiden Sie diese Vorgehensweise jedoch, da sie verhindert, dass der Systembeschleuniger seine Standardrolle in der Benutzeroberfläche ausführt. Die systemweiten Accelerators werden in der folgenden Liste beschrieben:
Accelerator | Beschreibung |
---|---|
ALT+ESC | Wechselt zur nächsten Anwendung. |
ALT+F4 | Schließt eine Anwendung oder ein Fenster. |
ALT+BINDESTRICH | Öffnet das Menü Fenster für ein Dokumentfenster. |
ALT+DRUCKBILDSCHIRM | Kopiert ein Bild im aktiven Fenster in die Zwischenablage. |
ALT+LEERTASTE | Öffnet das Menü Fenster für das Standard Fenster der Anwendung. |
ALT+TAB | Wechselt zur nächsten Anwendung. |
STRG+ESC | Wechselt zum Startmenü . |
STRG+F4 | Schließt das aktive Gruppen- oder Dokumentfenster. |
F1 | Startet die Hilfedatei der Anwendung, sofern vorhanden. |
DRUCK | Kopiert ein Bild auf dem Bildschirm in die Zwischenablage. |
UMSCHALT+ALT+TAB | Wechselt zur vorherigen Anwendung. Der Benutzer muss ALT+UMSCHALT drücken und gedrückt halten, während er die TAB-TASTE drückt. |
Beschleuniger und Menüs
Die Verwendung eines Accelerators ist identisch mit der Auswahl eines Menüelements: Beide Aktionen führen dazu, dass das System eine WM_COMMAND oder WM_SYSCOMMAND Nachricht an die entsprechende Fensterprozedur sendet. Die WM_COMMAND Nachricht enthält einen Bezeichner, den die Fensterprozedur untersucht, um die Quelle der Nachricht zu ermitteln. Wenn ein Accelerator die WM_COMMAND Meldung generiert hat, ist der Bezeichner der Bezeichner des Accelerators. Wenn ein Menüelement die WM_COMMAND Nachricht generiert hat, ist der Bezeichner der des Menüelements. Da ein Accelerator eine Tastenkombination zum Auswählen eines Befehls aus einem Menü bereitstellt, weist eine Anwendung in der Regel denselben Bezeichner dem Accelerator und dem entsprechenden Menüelement zu.
Eine Anwendung verarbeitet einen Accelerator WM_COMMAND Nachricht genauso wie das entsprechende Menüelement WM_COMMAND Nachricht. Die WM_COMMAND Nachricht enthält jedoch ein Flag, das angibt, ob die Nachricht von einem Accelerator oder einem Menüelement stammt, falls Accelerators anders als die entsprechenden Menüelemente verarbeitet werden müssen. Die WM_SYSCOMMAND-Nachricht enthält dieses Flag nicht.
Der Bezeichner bestimmt, ob ein Accelerator eine WM_COMMAND - oder WM_SYSCOMMAND-Nachricht generiert. Wenn der Bezeichner den gleichen Wert wie ein Menüelement im Systemmenü aufweist, generiert der Accelerator eine WM_SYSCOMMAND Nachricht. Andernfalls generiert der Accelerator eine WM_COMMAND-Nachricht .
Wenn ein Accelerator über denselben Bezeichner wie ein Menüelement verfügt und das Menüelement abgeblendet oder deaktiviert ist, ist der Accelerator deaktiviert und generiert keine WM_COMMAND oder WM_SYSCOMMAND Nachricht. Außerdem generiert ein Accelerator keine Befehlsmeldung, wenn das entsprechende Fenster minimiert ist.
Wenn der Benutzer einen Accelerator verwendet, der einem Menüelement entspricht, empfängt die Fensterprozedur die WM_INITMENU und WM_INITMENUPOPUP Nachrichten, als ob der Benutzer das Menüelement ausgewählt hätte. Informationen zum Verarbeiten dieser Nachrichten finden Sie unter Menüs.
Ein Accelerator, der einem Menüelement entspricht, sollte im Text des Menüelements enthalten sein.
Benutzeroberflächenstatus
Windows ermöglicht Es Anwendungen, verschiedene Features auf der Benutzeroberfläche auszublenden oder anzuzeigen. Diese Einstellungen werden als Benutzeroberflächenstatus bezeichnet. Der Benutzeroberflächenstatus umfasst die folgenden Einstellungen:
- Fokusindikatoren (z. B. Fokusrechtecke auf Schaltflächen)
- Tastaturbeschleunigungen (durch Unterstrichen in Steuerbeschriftungen gekennzeichnet)
Ein Fenster kann Nachrichten senden, um eine Änderung des UI-Zustands anzufordern, kann den UI-Zustand abfragen oder einen bestimmten Zustand für die untergeordneten Fenster erzwingen. Diese Meldungen sind wie folgt:
`Message` | BESCHREIBUNG |
---|---|
WM_CHANGEUISTATE | Gibt an, dass sich der Benutzeroberflächenstatus ändern soll. |
WM_QUERYUISTATE | Ruft den Benutzeroberflächenstatus für ein Fenster ab. |
WM_UPDATEUISTATE | Ändert den Benutzeroberflächenstatus. |
Standardmäßig werden alle untergeordneten Fenster eines Fensters auf oberster Ebene mit demselben Benutzeroberflächenstatus wie ihr übergeordnetes Fenster erstellt.
Das System verarbeitet den Benutzeroberflächenstatus für Steuerelemente in Dialogfeldern. Bei der Erstellung des Dialogfelds initialisiert das System den Ui-Zustand entsprechend. Alle untergeordneten Steuerelemente erben diesen Zustand. Nachdem das Dialogfeld erstellt wurde, überwacht das System die Tastenanschläge des Benutzers. Wenn die Benutzeroberflächenstatuseinstellungen ausgeblendet sind und der Benutzer mit der Tastatur navigiert, aktualisiert das System den Ui-Zustand. Wenn der Benutzer beispielsweise die TAB-TASTE drückt, um den Fokus auf das nächste Steuerelement zu verschieben, ruft das System WM_CHANGEUISTATE auf, um die Fokusindikatoren sichtbar zu machen. Wenn der Benutzer die ALT-TASTE drückt, ruft das System WM_CHANGEUISTATE auf, um die Tastenkombinationen sichtbar zu machen.
Wenn ein Steuerelement die Navigation zwischen den enthaltenen UI-Elementen unterstützt, kann es seinen eigenen UI-Zustand aktualisieren. Das Steuerelement kann WM_QUERYUISTATE aufrufen, um den anfänglichen Ui-Zustand abzurufen und zwischenzuspeichern. Wenn das Steuerelement eine WM_UPDATEUISTATE-Nachricht empfängt, kann es seinen Benutzeroberflächenstatus aktualisieren und eine WM_CHANGEUISTATE Nachricht an sein übergeordnetes Element senden. Jedes Fenster sendet die Nachricht weiterhin an sein übergeordnetes Element, bis sie das Fenster der obersten Ebene erreicht. Das Fenster der obersten Ebene sendet die WM_UPDATEUISTATE Nachricht an die Fenster in der Fensterstruktur. Wenn ein Fenster die WM_CHANGEUISTATE Meldung nicht übergibt, wird das Fenster der obersten Ebene nicht erreicht, und der Benutzeroberflächenstatus wird nicht aktualisiert.