Partilhar via


Sobre os aceleradores de teclado

Os aceleradores estão intimamente relacionados aos menus — ambos fornecem ao usuário acesso ao conjunto de comandos de um aplicativo. Normalmente, os usuários confiam nos menus de um aplicativo para aprender o conjunto de comandos e, em seguida, passar a usar aceleradores à medida que se tornam mais proficientes com o aplicativo. Os aceleradores fornecem acesso mais rápido e direto aos comandos do que os menus. No mínimo, um aplicativo deve fornecer aceleradores para os comandos mais comumente usados. Embora os aceleradores normalmente gerem comandos que existem como itens de menu, eles também podem gerar comandos que não têm itens de menu equivalentes.

Esta seção abrange os seguintes tópicos.

Tabelas Aceleradoras

Uma tabela de aceleração consiste em uma matriz de estruturas ACCEL, cada uma definindo um acelerador individual. Cada estrutura ACCEL inclui as seguintes informações:

  • A combinação de pressionamento de teclas do acelerador.
  • O identificador do acelerador.
  • Várias bandeiras. Isso inclui um que especifica se o sistema deve fornecer feedback visual destacando o item de menu correspondente, se houver, quando o acelerador é usado

Para processar teclas de atalho para um thread especificado, o desenvolvedor deve chamar a função TranslateAccelerator no loop de mensagens associado à fila de mensagens do thread. A função TranslateAccelerator monitora a entrada do teclado na fila de mensagens, verificando se há combinações de teclas que correspondam a uma entrada na tabela de aceleradores. Quando TranslateAccelerator encontra uma correspondência, traduz a entrada do teclado (ou seja, as mensagens WM_KEYUP e WM_KEYDOWN) numa mensagem WM_COMMAND ou WM_SYSCOMMAND e, em seguida, envia a mensagem para o procedimento da janela especificada. A ilustração a seguir mostra como os aceleradores são processados.

modelo de processamento do acelerador de teclado

A mensagem WM_COMMAND inclui o identificador do acelerador que fez com que TranslateAccelerator gerasse a mensagem. O procedimento da janela examina o identificador para determinar a origem da mensagem e, em seguida, processa a mensagem de acordo.

As tabelas de aceleração existem em dois níveis diferentes. O sistema mantém uma única tabela aceleradora em todo o sistema que se aplica a todos os aplicativos. Um aplicativo não pode modificar a tabela do acelerador do sistema. Para obter uma descrição dos aceleradores fornecidos pela tabela de aceleradores do sistema, consulte as atribuições de atalhos de aceleradores .

O sistema também mantém tabelas de aceleração para cada aplicação. Um aplicativo pode definir qualquer número de tabelas de aceleração para uso com suas próprias janelas. Um identificador único de 32 bits (HACCEL) identifica cada tabela. No entanto, apenas uma tabela aceleradora pode estar ativa de cada vez para um thread especificado. O identificador para a tabela aceleradora passada para a funçãoTranslateAccelerator dodetermina qual tabela aceleradora está ativa para um thread. A tabela de aceleração ativa pode ser alterada a qualquer momento, passando um identificador de tabela de aceleração diferente para TranslateAccelerator.

Criação Accelerator-Table

Várias etapas são necessárias para criar uma tabela aceleradora para um aplicativo. Primeiro, um compilador de recursos é usado para criar recursos de tabela aceleradora e adicioná-los ao arquivo executável do aplicativo. Em tempo de execução, a função LoadAccelerators é usada para carregar a tabela do acelerador na memória e recuperar o identificador para a tabela do acelerador. Esse identificador é passado para a função TranslateAcceleratordopara ativar a tabela de aceleradores.

Uma tabela de aceleradores também pode ser criada para uma aplicação durante o tempo de execução, passando uma matriz de estruturas ACCEL para a função CreateAcceleratorTable. Esse método suporta aceleradores definidos pelo usuário no aplicativo. Como a função LoadAccelerators , CreateAcceleratorTable retorna um handle da tabela de aceleradores que pode ser passado para TranslateAccelerator para ativar a tabela de aceleradores.

O sistema destrói automaticamente as tabelas de aceleração carregadas por LoadAccelerators ou criadas por CreateAcceleratorTable. No entanto, um aplicativo pode liberar recursos enquanto está em execução, destruindo tabelas de aceleração que não são mais necessárias chamando a funçãoDestroyAcceleratorTable.

Uma tabela aceleradora existente pode ser copiada e modificada. A tabela aceleradora existente é copiada usando a função CopyAcceleratorTable. Depois de a cópia ser modificada, é recuperado um identificador para a nova tabela de aceleradores chamando CreateAcceleratorTable. Finalmente, o identificador é passado para TranslateAccelerator para ativar a nova tabela.

Atribuições de pressionamento de tecla do acelerador

Um código de caractere ASCII ou um código de chave virtual pode ser usado para definir o acelerador. Um código de caractere ASCII torna o acelerador sensível a maiúsculas e minúsculas. Assim, usando o caractere ASCII "C" define o acelerador como ALT+C em vez de ALT+c. No entanto, os aceleradores que diferenciam maiúsculas de minúsculas podem ser confusos de usar. Por exemplo, o acelerador ALT+C será gerado se a tecla CAPS LOCK estiver inativa ou se a tecla SHIFT estiver inativa, mas não se ambas estiverem inativas.

Normalmente, os aceleradores não precisam diferenciar maiúsculas de minúsculas, então a maioria dos aplicativos usa códigos de chave virtual para aceleradores em vez de códigos de caracteres ASCII.

Evite aceleradores que entrem em conflito com o menu mnemônico de um aplicativo, porque o acelerador substitui o mnemônico, o que pode confundir o usuário. Para obter mais informações sobre mnemônicos de menu, consulte Menus.

Se um aplicativo define um acelerador que também é definido na tabela do acelerador do sistema, o acelerador definido pelo aplicativo substitui o acelerador do sistema, mas apenas dentro do contexto do aplicativo. Evite essa prática, no entanto, porque impede que o acelerador do sistema execute sua função padrão na interface do usuário. Os aceleradores de todo o sistema são descritos na lista a seguir:

Acelerador Descrição
ALT+ESC Muda para a próxima aplicação.
ALT+F4 Fecha um aplicativo ou uma janela.
ALT+HÍFEN Abre o menu janela para uma janela de documento.
ALT+IMPRIMIR ECRÃ Copia uma imagem na janela ativa para a área de transferência.
ALT+BARRA DE ESPAÇO Abre o menu Janela para a janela principal da aplicação.
ALT+TAB Muda para a próxima aplicação.
CTRL+ESC Alterna para o menu Iniciar.
CTRL+F4 Fecha o grupo ativo ou a janela do documento.
F1 Inicia o arquivo de ajuda do aplicativo, se existir.
IMPRIMIR ECRÃ Copia uma imagem na tela para a área de transferência.
SHIFT+ALT+TAB Alterna para o aplicativo anterior. O usuário deve pressionar e manter pressionada a tecla ALT+SHIFT enquanto pressiona TAB.

 

Aceleradores e Menus

Usar um acelerador é o mesmo que escolher um item de menu: ambas as ações fazem com que o sistema envie uma mensagem WM_COMMAND ou WM_SYSCOMMAND para o procedimento de janela correspondente. A mensagem WM_COMMAND inclui um identificador que o procedimento da janela examina para determinar a origem da mensagem. Se um acelerador gerou a mensagem WM_COMMAND, o identificador é o do acelerador. Da mesma forma, se um item de menu gerou a mensagem WM_COMMAND, o identificador é o do item de menu. Como um acelerador fornece um atalho para escolher um comando em um menu, um aplicativo geralmente atribui o mesmo identificador ao acelerador e ao item de menu correspondente.

Um aplicativo processa uma mensagem de acelerador WM_COMMAND exatamente da mesma forma que a mensagem de comando do item de menu correspondente WM_COMMAND. No entanto, a mensagem WM_COMMAND contém um sinalizador que especifica se a mensagem se originou de um acelerador ou de um item de menu, caso os aceleradores devam ser processados de forma diferente dos itens de menu correspondentes. A mensagem WM_SYSCOMMAND não contém esse sinalizador.

O identificador determina se um acelerador gera uma mensagem WM_COMMAND ou WM_SYSCOMMAND. Se o identificador tiver o mesmo valor que um item de menu no menu Sistema, o acelerador gerará uma mensagem WM_SYSCOMMAND. Caso contrário, o acelerador gera uma mensagem WM_COMMAND.

Se um acelerador tiver o mesmo identificador que um item de menu e o item de menu estiver acinzentado ou desativado, o acelerador será desativado e não gerará uma mensagem WM_COMMAND ou WM_SYSCOMMAND. Além disso, um acelerador não gera uma mensagem de comando se a janela correspondente for minimizada.

Quando o usuário usa um acelerador que corresponde a um item de menu, o procedimento de janela recebe as mensagens WM_INITMENU e WM_INITMENUPOPUP como se o usuário tivesse selecionado o item de menu. Para obter informações sobre como processar essas mensagens, consulte Menus.

Um acelerador que corresponde a um item de menu deverá ser incluído no texto desse item de menu.

Estado da interface do usuário

O Windows permite que os aplicativos ocultem ou mostrem vários recursos em sua interface do usuário. Essas configurações são conhecidas como o estado da interface do usuário. O estado da interface do usuário inclui as seguintes configurações:

  • indicadores de foco (como retângulos de foco em botões)
  • aceleradores de teclado (indicados por sublinhados nos rótulos de controlo)

Uma janela pode enviar mensagens para solicitar uma alteração no estado da interface do usuário, pode consultar o estado da interface do usuário ou impor um determinado estado para suas janelas filhas. Estas mensagens são as seguintes.

Mensagem Descrição
WM_CHANGEUISTATE Indica que o estado da interface do usuário deve mudar.
WM_QUERYUISTATE Recupera o estado da interface de uma janela.
WM_UPDATEUISTATE Altera o estado da interface do usuário.

 

Por padrão, todas as janelas filhas de uma janela de nível superior são criadas com o mesmo estado da interface que a janela-mãe.

O sistema manipula o estado da interface do usuário para controles em caixas de diálogo. Na criação da caixa de diálogo, o sistema inicializa o estado da interface de utilizador em conformidade. Todos os controles filho herdam esse estado. Depois que a caixa de diálogo é criada, o sistema monitora as teclas pressionadas pelo usuário. Se as configurações de estado da interface do usuário estiverem ocultas e o usuário navegar usando o teclado, o sistema atualizará o estado da interface do usuário. Por exemplo, se o usuário pressionar a tecla Tab para mover o foco para o próximo controle, o sistema chamará WM_CHANGEUISTATE para tornar os indicadores de foco visíveis. Se o usuário pressionar a tecla Alt, o sistema chamará WM_CHANGEUISTATE para tornar os aceleradores do teclado visíveis.

Se um controle oferecer suporte à navegação entre os elementos da interface do usuário que ele contém, ele poderá atualizar seu próprio estado da interface do usuário. O controle pode chamar WM_QUERYUISTATE para recuperar e armazenar em cache o estado inicial da interface do usuário. Sempre que o controle recebe uma mensagem WM_UPDATEUISTATE, ele pode atualizar seu estado da interface do usuário e enviar uma mensagem WM_CHANGEUISTATE para seu pai. Cada janela continuará a enviar a mensagem para a janela mãe até chegar à janela de nível superior. A janela de nível superior envia a mensagem WM_UPDATEUISTATE para as janelas na árvore de janelas. Se uma janela não passar a mensagem WM_CHANGEUISTATE, ela não alcançará a janela de nível superior e o estado da interface do usuário não será atualizado.