Sobre 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 dependem dos menus de um aplicativo para aprender o conjunto de comandos e, em seguida, alternar para o uso de aceleradores à medida que eles 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 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 aborda os tópicos a seguir.

Tabelas de aceleradores

Uma tabela de aceleradores 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ários sinalizadores. Isso inclui um que especifica se o sistema deve fornecer comentários visuais realçando o item de menu correspondente, se houver, quando o acelerador é usado

Para processar pressionamentos de teclas de acelerador para um thread especificado, o desenvolvedor deve chamar a função TranslateAccelerator no loop de mensagem 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, ele converte a entrada do teclado (ou seja, as mensagens WM_KEYUP e WM_KEYDOWN ) em uma mensagem de WM_COMMAND ou WM_SYSCOMMAND e, em seguida, envia a mensagem para o procedimento de janela 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 de janela examina o identificador para determinar a origem da mensagem e processa a mensagem adequadamente.

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

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

Criação de Accelerator-Table

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

Uma tabela de aceleradores também pode ser criada para um aplicativo em tempo de execução passando uma matriz de estruturas ACCEL para a função CreateAcceleratorTable . Esse método dá suporte a aceleradores definidos pelo usuário no aplicativo. Assim como a função LoadAccelerators , CreateAcceleratorTable retorna um identificador accelerator-table que pode ser passado para TranslateAccelerator para ativar a tabela de aceleradores.

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

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

Atribuições de pressionamento de tecla de 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 diferencia maiúsculas de minúsculas do acelerador. Portanto, o uso do caractere ASCII "C" define o acelerador como ALT+C em vez de ALT+c. No entanto, 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, portanto, a maioria dos aplicativos usa códigos de chave virtual para aceleradores em vez de códigos de caractere ASCII.

Evite aceleradores que entrem em conflito com os mnemônicos de menu de um aplicativo, pois 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 definir um acelerador que também é definido na tabela de aceleradores do sistema, o acelerador definido pelo aplicativo substituirá o acelerador do sistema, mas somente dentro do contexto do aplicativo. Evite essa prática, no entanto, porque ela impede que o acelerador de 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 Alterna para o próximo aplicativo.
ALT+F4 Fecha um aplicativo ou uma janela.
ALT+HÍFEN Abre o menu Janela de uma janela de documento.
ALT+PRINT SCREEN Copia uma imagem na janela ativa para a área de transferência.
ALT+BARRA DE ESPAÇOS Abre o menu Janela da janela de main do aplicativo.
ALT+TAB Alterna para o próximo aplicativo.
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 houver.
PRINT SCREEN 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 segurar 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 de WM_COMMAND ou WM_SYSCOMMAND para o procedimento de janela correspondente. A mensagem WM_COMMAND inclui um identificador que o procedimento de janela examina para determinar a origem da mensagem. Se um acelerador gerou a mensagem WM_COMMAND , o identificador será o do acelerador. Da mesma forma, se um item de menu gerou a mensagem WM_COMMAND , o identificador será 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 um acelerador WM_COMMAND mensagem exatamente da mesma forma que o item de menu correspondente WM_COMMAND mensagem. 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 precisem 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 de 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 gerará uma mensagem WM_COMMAND .

Se um acelerador tiver o mesmo identificador que um item de menu e o item de menu estiver esmaecido ou desabilitado, o acelerador será desabilitado e não gerará uma mensagem WM_COMMAND ou WM_SYSCOMMAND . Além disso, um acelerador não gerará 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 o WM_INITMENU e WM_INITMENUPOPUP mensagens 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 deve ser incluído no texto do 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 em rótulos de controle)

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 filho. Essas mensagens são as seguintes.

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

 

Por padrão, todas as janelas filho de uma janela de nível superior são criadas com o mesmo estado da interface do usuário que o pai.

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 do usuário adequadamente. Todos os controles filho herdam esse estado. Depois que a caixa de diálogo é criada, o sistema monitora os pressionamentos de tecla do 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 de teclado visíveis.

Se um controle der suporte à navegação entre os elementos de interface do usuário que ele contém, ele poderá atualizar seu próprio estado de 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 de interface do usuário e enviar uma mensagem WM_CHANGEUISTATE para seu pai. Cada janela continuará a enviar a mensagem para seu pai até atingir a 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 atingirá a janela de nível superior e o estado da interface do usuário não será atualizado.