Acerca de los aceleradores de teclado

Los aceleradores están estrechamente relacionados con los menús: ambos proporcionan al usuario acceso al conjunto de comandos de una aplicación. Normalmente, los usuarios dependen de los menús de una aplicación para aprender el conjunto de comandos y, a continuación, cambiar a usar aceleradores a medida que se vuelven más competentes con la aplicación. Los aceleradores proporcionan un acceso más rápido y directo a los comandos que los menús. Como mínimo, una aplicación debe proporcionar aceleradores para los comandos más usados. Aunque los aceleradores suelen generar comandos que existen como elementos de menú, también pueden generar comandos que no tengan elementos de menú equivalentes.

En esta sección se tratan los temas siguientes.

Tablas de aceleradores

Una tabla de aceleradores consta de una matriz de estructuras ACCEL , cada una de las cuales define un acelerador individual. Cada estructura ACCEL incluye la siguiente información:

  • Combinación de pulsación de tecla del acelerador.
  • Identificador del acelerador.
  • Varias marcas. Esto incluye uno que especifica si el sistema va a proporcionar comentarios visuales resaltando el elemento de menú correspondiente, si existe, cuando se usa el acelerador.

Para procesar pulsaciones de tecla del acelerador para un subproceso especificado, el desarrollador debe llamar a la función TranslateAccelerator en el bucle de mensajes asociado a la cola de mensajes del subproceso. La función TranslateAccelerator supervisa la entrada del teclado en la cola de mensajes, comprobando las combinaciones de teclas que coinciden con una entrada en la tabla del acelerador. Cuando TranslateAccelerator encuentra una coincidencia, traduce la entrada del teclado (es decir, los mensajes WM_KEYUP y WM_KEYDOWN ) en un mensaje de WM_COMMAND o WM_SYSCOMMAND y, a continuación, envía el mensaje al procedimiento de ventana de la ventana especificada. En la ilustración siguiente se muestra cómo se procesan los aceleradores.

modelo de procesamiento del acelerador de teclado

El mensaje WM_COMMAND incluye el identificador del acelerador que provocó que TranslateAccelerator generara el mensaje. El procedimiento de ventana examina el identificador para determinar el origen del mensaje y, a continuación, procesa el mensaje en consecuencia.

Las tablas de acelerador existen en dos niveles diferentes. El sistema mantiene una única tabla de aceleradores para todo el sistema que se aplica a todas las aplicaciones. Una aplicación no puede modificar la tabla del acelerador del sistema. Para obtener una descripción de los aceleradores proporcionados por la tabla del acelerador del sistema, consulte Asignaciones de pulsación de teclas del acelerador.

El sistema también mantiene tablas de acelerador para cada aplicación. Una aplicación puede definir cualquier número de tablas aceleradoras para su uso con sus propias ventanas. Un identificador único de 32 bits (HACCEL) identifica cada tabla. Sin embargo, solo una tabla de aceleradores puede estar activa a la vez para un subproceso especificado. El identificador de la tabla de aceleradores que se pasa a la función TranslateAccelerator determina qué tabla de aceleradores está activa para un subproceso. La tabla de aceleradores activa se puede cambiar en cualquier momento pasando un controlador de tabla de acelerador diferente a TranslateAccelerator.

creación de Accelerator-Table

Se requieren varios pasos para crear una tabla de aceleración para una aplicación. En primer lugar, se usa un compilador de recursos para crear recursos de tabla de aceleradores y agregarlos al archivo ejecutable de la aplicación. En tiempo de ejecución, la función LoadAccelerators se usa para cargar la tabla del acelerador en memoria y recuperar el identificador de la tabla de aceleradores. Este identificador se pasa a la función TranslateAccelerator para activar la tabla del acelerador.

También se puede crear una tabla de aceleradores para una aplicación en tiempo de ejecución pasando una matriz de estructuras ACCEL a la función CreateAcceleratorTable . Este método admite aceleradores definidos por el usuario en la aplicación. Al igual que la función LoadAccelerators , CreateAcceleratorTable devuelve un identificador de tabla de acelerador que se puede pasar a TranslateAccelerator para activar la tabla de aceleradores.

El sistema destruye automáticamente las tablas aceleradoras cargadas por LoadAccelerators o creadas por CreateAcceleratorTable. Sin embargo, una aplicación puede liberar recursos mientras se ejecuta mediante la destrucción de tablas de aceleración ya no necesarias mediante una llamada a la función DestroyAcceleratorTable .

Se puede copiar y modificar una tabla de aceleradores existente. La tabla de aceleradores existente se copia mediante la función CopyAcceleratorTable . Una vez modificada la copia, se recupera un identificador de la nueva tabla de aceleradores mediante una llamada a CreateAcceleratorTable. Por último, el identificador se pasa a TranslateAccelerator para activar la nueva tabla.

Asignaciones de pulsación de teclas del acelerador

Se puede usar un código de carácter ASCII o un código de clave virtual para definir el acelerador. Un código de caracteres ASCII distingue mayúsculas de minúsculas del acelerador. Por lo tanto, el uso del carácter ASCII "C" define el acelerador como ALT+C en lugar de ALT+c. Sin embargo, los aceleradores con distinción entre mayúsculas y minúsculas pueden resultar confusos de usar. Por ejemplo, se generará el acelerador ALT+C si la tecla CAPS LOCK está inactiva o si la tecla MAYÚS está inactiva, pero no si ambas están inactivas.

Normalmente, los aceleradores no necesitan distinguir mayúsculas de minúsculas, por lo que la mayoría de las aplicaciones usan códigos de clave virtual para aceleradores en lugar de códigos de caracteres ASCII.

Evite aceleradores que entren en conflicto con los mnemonics de menú de una aplicación, ya que el acelerador invalida la mnemonic, que puede confundir al usuario. Para obtener más información sobre los menús mnemonics, vea Menús.

Si una aplicación define un acelerador que también se define en la tabla del acelerador del sistema, el acelerador definido por la aplicación invalida el acelerador del sistema, pero solo dentro del contexto de la aplicación. Sin embargo, evite esta práctica, ya que impide que el acelerador del sistema realice su rol estándar en la interfaz de usuario. Los aceleradores de todo el sistema se describen en la lista siguiente:

Acelerador Descripción
ALT+ESC Cambia a la siguiente aplicación.
ALT+F4 Cierra una aplicación o una ventana.
ALT+GUIÓN Abre el menú Ventana de una ventana de documento.
ALT+PANTALLA DE IMPRESIÓN Copia una imagen en la ventana activa en el Portapapeles.
ALT+Barra espaciadora Abre el menú Ventana de la ventana principal de la aplicación.
ALT+TAB Cambia a la siguiente aplicación.
CTRL+ESC Cambia al menú Inicio .
CTRL+F4 Cierra la ventana de grupo o documento activa.
F1 Inicia el archivo de ayuda de la aplicación, si existe uno.
IMPRIMIR PANTALLA Copia una imagen en la pantalla en el Portapapeles.
MAYÚS+ALT+TAB Cambia a la aplicación anterior. El usuario debe presionar y mantener presionada la tecla ALT+MAYÚS mientras presiona la tecla TAB.

 

Aceleradores y menús

El uso de un acelerador es el mismo que elegir un elemento de menú: ambas acciones hacen que el sistema envíe un mensaje de WM_COMMAND o WM_SYSCOMMAND al procedimiento de ventana correspondiente. El mensaje WM_COMMAND incluye un identificador que examina el procedimiento de ventana para determinar el origen del mensaje. Si un acelerador generó el mensaje de WM_COMMAND , el identificador es el del acelerador. Del mismo modo, si un elemento de menú generó el mensaje de WM_COMMAND , el identificador es el del elemento de menú. Dado que un acelerador proporciona un acceso directo para elegir un comando en un menú, una aplicación normalmente asigna el mismo identificador al acelerador y al elemento de menú correspondiente.

Una aplicación procesa un mensaje de aceleración WM_COMMAND exactamente igual que el elemento de menú correspondiente WM_COMMAND mensaje. Sin embargo, el mensaje de WM_COMMAND contiene una marca que especifica si el mensaje se originó desde un acelerador o un elemento de menú, en caso de que los aceleradores se procesen de forma diferente a los elementos de menú correspondientes. El mensaje WM_SYSCOMMAND no contiene esta marca.

El identificador determina si un acelerador genera un mensaje de WM_COMMAND o WM_SYSCOMMAND . Si el identificador tiene el mismo valor que un elemento de menú en el menú Sistema, el acelerador genera un mensaje WM_SYSCOMMAND . De lo contrario, el acelerador genera un mensaje de WM_COMMAND .

Si un acelerador tiene el mismo identificador que un elemento de menú y el elemento de menú está atenuado o deshabilitado, el acelerador está deshabilitado y no genera un mensaje de WM_COMMAND o WM_SYSCOMMAND . Además, un acelerador no genera un mensaje de comando si se minimiza la ventana correspondiente.

Cuando el usuario usa un acelerador que corresponde a un elemento de menú, el procedimiento de ventana recibe el WM_INITMENU y WM_INITMENUPOPUP mensajes como si el usuario hubiera seleccionado el elemento de menú. Para obtener información sobre cómo procesar estos mensajes, vea Menús.

Un acelerador que corresponde a un elemento de menú debe incluirse en el texto del elemento de menú.

Estado de la interfaz de usuario

Windows permite a las aplicaciones ocultar o mostrar varias características en su interfaz de usuario. Esta configuración se conoce como estado de la interfaz de usuario. El estado de la interfaz de usuario incluye la siguiente configuración:

  • indicadores de foco (como rectángulos de foco en botones)
  • aceleradores de teclado (indicados por subrayados en etiquetas de control)

Una ventana puede enviar mensajes para solicitar un cambio en el estado de la interfaz de usuario, puede consultar el estado de la interfaz de usuario o aplicar un determinado estado para sus ventanas secundarias. Estos mensajes son los siguientes.

Message Descripción
WM_CHANGEUISTATE Indica que el estado de la interfaz de usuario debe cambiar.
WM_QUERYUISTATE Recupera el estado de la interfaz de usuario de una ventana.
WM_UPDATEUISTATE Cambia el estado de la interfaz de usuario.

 

De forma predeterminada, todas las ventanas secundarias de una ventana de nivel superior se crean con el mismo estado de interfaz de usuario que su elemento primario.

El sistema controla el estado de la interfaz de usuario de los controles de los cuadros de diálogo. En la creación del cuadro de diálogo, el sistema inicializa el estado de la interfaz de usuario en consecuencia. Todos los controles secundarios heredan este estado. Una vez creado el cuadro de diálogo, el sistema supervisa las pulsaciones de tecla del usuario. Si la configuración de estado de la interfaz de usuario está oculta y el usuario navega mediante el teclado, el sistema actualiza el estado de la interfaz de usuario. Por ejemplo, si el usuario presiona la tecla Tab para mover el foco al siguiente control, el sistema llama a WM_CHANGEUISTATE para que los indicadores de foco sean visibles. Si el usuario presiona la tecla Alt, el sistema llama a WM_CHANGEUISTATE para que los aceleradores de teclado sean visibles.

Si un control admite la navegación entre los elementos de la interfaz de usuario que contiene, puede actualizar su propio estado de interfaz de usuario. El control puede llamar a WM_QUERYUISTATE para recuperar y almacenar en caché el estado inicial de la interfaz de usuario. Cada vez que el control recibe un mensaje de WM_UPDATEUISTATE , puede actualizar su estado de interfaz de usuario y enviar un mensaje de WM_CHANGEUISTATE a su elemento primario. Cada ventana seguirá enviando el mensaje a su elemento primario hasta que llegue a la ventana de nivel superior. La ventana de nivel superior envía el mensaje WM_UPDATEUISTATE a las ventanas del árbol de ventanas. Si una ventana no pasa el mensaje de WM_CHANGEUISTATE , no llegará a la ventana de nivel superior y el estado de la interfaz de usuario no se actualizará.