Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os aplicativos devem aceitar a entrada do usuário do teclado, bem como do mouse. Um aplicativo recebe entrada de teclado na forma de mensagens postadas em suas janelas.
Modelo de entrada de teclado
O sistema fornece suporte a teclado independente do dispositivo para aplicativos instalando um driver de dispositivo de teclado apropriado para o teclado atual. O sistema fornece suporte a teclado independente de linguagem usando o layout de teclado específico do idioma atualmente selecionado pelo usuário ou pelo aplicativo. O driver do dispositivo de teclado recebe códigos de verificação do teclado, que são enviados para o layout do teclado em que são convertidos em mensagens e postados nas janelas apropriadas em seu aplicativo.
Atribuído a cada tecla em um teclado é um valor exclusivo chamado código de verificação, um identificador dependente do dispositivo para a tecla no teclado. Um teclado gera dois códigos de verificação quando o usuário digita uma tecla: uma quando o usuário pressiona a tecla e outra quando o usuário libera a tecla.
O driver do dispositivo de teclado interpreta um código de verificação e o converte (mapeia) para um código de chave virtual, um valor independente do dispositivo definido pelo sistema que identifica a finalidade de uma chave. Depois de traduzir um código de verificação, o layout do teclado cria uma mensagem que inclui o código de verificação, o código da chave virtual e outras informações sobre o pressionamento de teclas e, em seguida, coloca a mensagem na fila de mensagens do sistema. O sistema remove a mensagem da fila de mensagens do sistema e a posta na fila de mensagens do thread apropriado. Eventualmente, o loop de mensagem do thread remove a mensagem e a passa para o procedimento de janela apropriado para processamento. A figura a seguir ilustra o modelo de entrada do teclado.
Foco e ativação do teclado
O sistema posta mensagens de teclado na fila de mensagens do thread de primeiro plano que criou a janela com o foco do teclado. O foco do teclado é uma propriedade temporária de uma janela. O sistema compartilha o teclado entre todas as janelas no visor, deslocando o foco do teclado, na direção do usuário, de uma janela para outra. A janela que tem o foco do teclado recebe (da fila de mensagens do thread que a criou) todas as mensagens de teclado até que o foco mude para uma janela diferente.
Um thread pode chamar a função GetFocus para determinar qual de suas janelas (se houver) atualmente tem o foco do teclado. Um thread pode dar o foco do teclado a uma de suas janelas chamando a função SetFocus . Quando o foco do teclado muda de uma janela para outra, o sistema envia uma mensagem WM_KILLFOCUS para a janela que perdeu o foco e envia uma mensagem WM_SETFOCUS para a janela que ganhou o foco.
O conceito de foco do teclado está relacionado ao da janela ativa. A janela ativa é a janela de nível superior com a qual o usuário está trabalhando no momento. A janela com o foco do teclado é a janela ativa ou uma janela filha da janela ativa. Para ajudar o usuário a identificar a janela ativa, o sistema a coloca na parte superior da ordem Z e realça sua barra de título (se ela tiver uma) e borda.
O usuário pode ativar uma janela de nível superior clicando nela, selecionando-a usando a combinação de teclas Alt+Tab ou Alt+Esc ou selecionando-a na Lista de Tarefas. Um thread pode ativar uma janela de nível superior usando a função SetActiveWindow . Ele pode determinar se uma janela de nível superior que ele criou está ativa usando a função GetActiveWindow .
Quando uma janela é desativada e outra ativada, o sistema envia a mensagem WM_ACTIVATE . A palavra de baixa ordem do parâmetro wParam será zero se a janela estiver sendo desativada e diferente de zero se estiver sendo ativada. Quando o procedimento de janela padrão recebe a mensagem WM_ACTIVATE , ele define o foco do teclado para a janela ativa.
Para impedir que eventos de entrada de teclado e mouse atinjam aplicativos, use BlockInput. Observe que a função BlockInput não interferirá na tabela de estado de entrada do teclado assíncrono. Isso significa que chamar a função SendInput enquanto a entrada estiver bloqueada alterará a tabela de estado de entrada do teclado assíncrono.
Mensagens de pressionamento de tecla
Pressionar uma tecla faz com que uma mensagem WM_KEYDOWN ou WM_SYSKEYDOWN seja colocada na fila de mensagens de thread anexada à janela que tem o foco do teclado. A liberação de uma chave faz com que uma mensagem WM_KEYUP ou WM_SYSKEYUP seja colocada na fila.
Normalment, as mensagens de tecla pressionada e tecla solta ocorrem em pares, mas se o usuário segurar uma tecla por tempo suficiente para iniciar o recurso de repetição automática do teclado, o sistema gera uma série de WM_KEYDOWN ou WM_SYSKEYDOWN mensagens em sequência. Em seguida, ele gera uma única mensagem de WM_KEYUP ou WM_SYSKEYUP quando o usuário libera a chave.
Esta seção contém os seguintes tópicos:
- Pressionamentos de teclas do sistema e não do sistema
- Virtual-Key Descrição dos códigos
- Sinalizadores de mensagem de pressionamento de tecla
Pressionamentos de teclas do sistema e não sistema
O sistema faz uma distinção entre pressionamentos de teclas do sistema e pressionamentos de teclas que não são do sistema. Os pressionamentos de teclas do sistema produzem mensagens de pressionamento de tecla do sistema, WM_SYSKEYDOWN e WM_SYSKEYUP. Os pressionamentos de teclas fora do sistema produzem mensagens de teclas fora do sistema, WM_KEYDOWN e WM_KEYUP.
Se o procedimento de janela precisar processar uma mensagem de pressionamento de tecla do sistema, verifique se, depois de processar a mensagem, o procedimento a passará para a função DefWindowProc . Caso contrário, todas as operações do sistema envolvendo a tecla Alt serão desabilitadas sempre que a janela tiver o foco do teclado. Ou seja, o usuário não poderá acessar os menus da janela ou o menu sistema ou usar o pressionamento de tecla Alt+Esc ou Alt+Tab para ativar uma janela diferente.
As mensagens de pressionamento de tecla do sistema são usadas principalmente pelo sistema e não por um aplicativo. O sistema os usa para fornecer sua interface de teclado interna aos menus e para permitir que o usuário controle qual janela está ativa. As mensagens de pressionamento de tecla do sistema são geradas quando o usuário digita uma tecla em combinação com a tecla Alt ou quando o usuário digita e nenhuma janela tem o foco do teclado (por exemplo, quando o aplicativo ativo é minimizado). Nesse caso, as mensagens são postadas na fila de mensagens anexada à janela ativa.
Mensagens de pressionamento de tecla fora do sistema são usadas pelas janelas do aplicativo; a função DefWindowProc não faz nada com elas. Um procedimento de janela pode descartar mensagens de teclas de sistema não usadas que não sejam necessárias.
Virtual-Key Códigos Descritos
O parâmetro wParam de uma mensagem de pressionamento de tecla contém o código de chave virtual da chave que foi pressionada ou liberada. Um procedimento de janela processa ou ignora uma mensagem de pressionamento de tecla, dependendo do valor do código de chave virtual.
Um procedimento de janela típico processa apenas um pequeno subconjunto das mensagens de pressionamento de tecla que ele recebe e ignora o restante. Por exemplo, um procedimento de janela pode processar apenas WM_KEYDOWN mensagens de pressionamento de tecla e somente aquelas que contêm códigos de chave virtual para as chaves de movimento do cursor, chaves de deslocamento (também chamadas de chaves de controle) e chaves de função. Um procedimento típico de janela não processa mensagens de pressionamento de teclas de caracteres. Em vez disso, ele usa a função TranslateMessage para converter a mensagem em mensagens de caractere. Para obter mais informações sobre TranslateMessage e mensagens de caractere, consulte Mensagens de Caractere.
Sinalizadores de mensagem de pressionamento de tecla
O parâmetro lParam de uma mensagem de pressionamento de tecla contém informações adicionais sobre o pressionamento de tecla que gerou a mensagem. Essas informações incluem a contagem de repetição, o código de verificação, o sinalizador de chave estendida, o código de contexto, o sinalizador de estado-chave anterior e o sinalizador de estado de transição. A ilustração a seguir mostra os locais desses sinalizadores e valores no parâmetro lParam .
Um aplicativo pode usar os seguintes valores para obter os sinalizadores de pressionamento de tecla da palavra de ordem superior do lParam.
Valor | Descrição |
---|---|
KF_EXTENDED 0x0100 |
Manipula o sinalizador de chave estendida. |
KF_DLGMODE 0x0800 |
Manipula o sinalizador do modo de diálogo, que indica se uma caixa de diálogo está ativa. |
KF_MENUMODE 0x1000 |
Manipula o sinalizador do modo de menu, que indica se um menu está ativo. |
KF_ALTDOWN 0x2000 |
Manipula o sinalizador de código de contexto. |
KF_REPEAT 0x4000 |
Manipula o sinalizador de estado da chave anterior. |
KF_UP 0x8000 |
Manipula o sinalizador de estado de transição. |
Código de exemplo:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
WORD vkCode = LOWORD(wParam); // virtual-key code
WORD keyFlags = HIWORD(lParam);
WORD scanCode = LOBYTE(keyFlags); // scan code
BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
if (isExtendedKey)
scanCode = MAKEWORD(scanCode, 0xE0);
BOOL wasKeyDown = (keyFlags & KF_REPEAT) == KF_REPEAT; // previous key-state flag, 1 on autorepeat
WORD repeatCount = LOWORD(lParam); // repeat count, > 0 if several keydown messages was combined into one message
BOOL isKeyReleased = (keyFlags & KF_UP) == KF_UP; // transition-state flag, 1 on keyup
// if we want to distinguish these keys:
switch (vkCode)
{
case VK_SHIFT: // converts to VK_LSHIFT or VK_RSHIFT
case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
case VK_MENU: // converts to VK_LMENU or VK_RMENU
vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
break;
}
// ...
}
break;
Contagem de Repetições
Você pode verificar a contagem de repetição para determinar se uma mensagem de pressionamento de tecla representa mais de um pressionamento de tecla. O sistema incrementa a contagem quando o teclado gera mensagens WM_KEYDOWN ou WM_SYSKEYDOWN mais rápido do que um aplicativo pode processá-las. Isso geralmente ocorre quando o usuário segura uma tecla por tempo suficiente para iniciar o recurso de repetição automática do teclado. Em vez de preencher a fila de mensagens do sistema com as mensagens resultantes de tecla pressionada, o sistema combina essas mensagens em uma única mensagem de tecla pressionada e aumenta o contador de repetição. A liberação de uma chave não pode iniciar o recurso de repetição automática, portanto, a contagem de repetição para WM_KEYUP e WM_SYSKEYUP mensagens é sempre definida como 1.
Códigos de verificação
O código de verificação é o valor que o sistema gera quando o usuário pressiona uma tecla. É um valor que identifica a tecla pressionada independentemente do layout do teclado ativo, em oposição ao caractere representado pela tecla. Um aplicativo normalmente ignora códigos de verificação. Em vez disso, ele usa os códigos de chave virtual para interpretar mensagens de pressionamento de tecla.
Os teclados modernos estão usando a especificação HID (Dispositivos de Interface Humana) para se comunicar com um computador. O driver de teclado converte os valores de HID Usage relatados enviados do teclado em códigos de escaneamento e os passa para aplicativos.
Observação
Embora os códigos de chave virtual normalmente sejam mais úteis para aplicativos da área de trabalho, os códigos de verificação podem ser necessários em casos específicos quando você precisa saber qual tecla é pressionada, independentemente do layout atual do teclado. Por exemplo, as associações de teclas WASD (W é para cima, A é para esquerda, S é para baixo e D é para direita) para jogos, que garantem uma formação de teclas consistente entre layouts de teclado QWERTY dos EUA ou AZERTY francês.
A tabela a seguir lista o conjunto de códigos de verificação, conforme reconhecido atualmente pelo Windows. Página HID de Uso/ID de Uso HID/Nome de Uso HID fazem referência ao documento Tabelas de Uso HID. Os valores Localização da Tecla fazem referência à imagem de teclado anterior.
O código Scan 1 Make é entregue nas mensagens WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP e WM_INPUT.
Nome da Página de Uso HID | Nome de uso hid | Página de Uso de HID | ID de uso HID | Fazer verificação 1 | Local da chave |
---|---|---|---|---|---|
Área de Trabalho Genérica | Desligamento do sistema | 0x0001 | 0x0081 | 0xE05E | |
Área de Trabalho Genérica | Suspensão do sistema | 0x0001 | 0x0082 | 0xE05F | |
Ambiente de Trabalho Genérico | Ativação do sistema | 0x0001 | 0x0083 | 0xE063 | |
Teclado/Teclado numérico | ErrorRollOver | 0x0007 | 0x0001 | 0x00FF | |
Teclado/Keypad | Teclado A | 0x0007 | 0x0004 | 0x001E | 31 |
Teclado/Teclado numérico | Teclado B | 0x0007 | 0x0005 | 0x0030 | 50 |
Teclado/Teclado numérico | Teclado C | 0x0007 | 0x0006 | 0x002E | 48 |
Teclado/Teclado numérico | Teclado D | 0x0007 | 0x0007 | 0x0020 | 33 |
Teclado/Teclado numérico | Teclado E | 0x0007 | 0x0008 | 0x0012 | 19 |
Teclado/Teclado numérico | Teclado F | 0x0007 | 0x0009 | 0x0021 | 34 |
Teclado/Teclado numérico | Teclado G | 0x0007 | 0x000A | 0x0022 | 35 |
Teclado/Teclado numérico | Teclado H | 0x0007 | 0x000B | 0x0023 | 36 |
Teclado/Teclado numérico | Teclado I | 0x0007 | 0x000C | 0x0017 | 24 |
Teclado/Teclado numérico | Teclado J | 0x0007 | 0x000D | 0x0024 | 37 |
Teclado/Teclado Numérico | Teclado K | 0x0007 | 0x000E | 0x0025 | 38 |
Teclado/Teclado Numérico | Teclado L | 0x0007 | 0x000F | 0x0026 | 39 |
Teclado/Teclado numérico | Teclado M | 0x0007 | 0x0010 | 0x0032 | 52 |
Teclado/Teclado Numérico | Teclado N | 0x0007 | 0x0011 | 0x0031 | 51 |
Teclado/Teclado numérico | Teclado O | 0x0007 | 0x0012 | 0x0018 | vinte e cinco |
Teclado/Teclado Numérico | Teclado P | 0x0007 | 0x0013 | 0x0019 | 26 |
Teclado/Teclado Numérico | Teclado Q | 0x0007 | 0x0014 | 0x0010 | 17 |
Teclado/Teclado numérico | Teclado R | 0x0007 | 0x0015 | 0x0013 | 20 |
Teclado/Teclado numérico | Teclado S | 0x0007 | 0x0016 | 0x001F | 32 |
Teclado/Teclado numérico | Teclado T | 0x0007 | 0x0017 | 0x0014 | 21 |
Teclado/Teclado numérico | Teclado U | 0x0007 | 0x0018 | 0x0016 | vinte e três |
Teclado/Teclado numérico | Teclado V | 0x0007 | 0x0019 | 0x002F | 49 |
Teclado/Teclado numérico | Teclado W | 0x0007 | 0x001A | 0x0011 | 18 |
Teclado/Teclado numérico | Teclado X | 0x0007 | 0x001B | 0x002D | 47 |
Teclado/Teclado numérico | Teclado Y | 0x0007 | 0x001C | 0x0015 | 22 |
Teclado/Teclado numérico | Teclado Z | 0x0007 | 0x001D | 0x002C | 46 |
Teclado/Teclado numérico | Teclado 1 e Bang | 0x0007 | 0x001E | 0x0002 | 2 |
Teclado/Teclado numérico | Teclado 2 e Em | 0x0007 | 0x001F | 0x0003 | 3 |
Teclado/Teclado numérico | Teclado 3 e Hash | 0x0007 | 0x0020 | 0x0004 | 4 |
Teclado/Teclado numérico | Teclado 4 e Dólar | 0x0007 | 0x0021 | 0x0005 | 5 |
Teclado/Teclado numérico | Teclado número 5 e símbolo de porcentagem | 0x0007 | 0x0022 | 0x0006 | 6 |
Teclado/Teclado numérico | Teclado 6 e Caret | 0x0007 | 0x0023 | 0x0007 | 7 |
Teclado/Teclado numérico | Teclado 7 e Ampersand | 0x0007 | 0x0024 | 0x0008 | oito |
Teclado/Teclado numérico | Teclado 8 e Estrela | 0x0007 | 0x0025 | 0x0009 | 9 |
Teclado/Teclado numérico | Teclado 9 e Colchete Esquerdo | 0x0007 | 0x0026 | 0x000A | 10 |
Teclado/Teclado numérico | Teclado 0 e Colchete direito | 0x0007 | 0x0027 | 0x000B | 11 |
Teclado/Teclado numérico | Tecla Enter Retorno | 0x0007 | 0x0028 | 0x001C | 43 |
Teclado/Teclado numérico | Escape de teclado | 0x0007 | 0x0029 | 0x0001 | 110 |
Teclado/Teclado numérico | Exclusão de teclado | 0x0007 | 0x002A | 0x000E | 15 |
Teclado/Teclado numérico | Tecla Tab | 0x0007 | 0x002B | 0x000F | 16 |
Teclado/Teclado numérico | Barra de espaços do teclado | 0x0007 | 0x002C | 0x0039 | 61 |
Teclado/Teclado numérico | Traço e sublinhado do teclado | 0x0007 | 0x002D | 0x000C | 12 |
Teclado/Teclado numérico | Teclado Igual e Mais | 0x0007 | 0x002E | 0x000D | 13 |
Teclado/Teclado numérico | Tecla de teclado esquerda | 0x0007 | 0x002F | 0x001A | 27 |
Teclado/Teclado numérico | Tecla de teclado à direita | 0x0007 | 0x0030 | 0x001B | 28 |
Teclado/Teclado numérico | Teclado Barra Invertida e Pipe | 0x0007 | 0x0031 | 0x002B | 29 |
Teclado/Teclado numérico | Hash e blocos de teclado que não são dos EUA | 0x0007 | 0x0032 | 0x002B | 42 |
Teclado/Teclado numérico | Teclado SemiColon e Colon | 0x0007 | 0x0033 | 0x0027 | 40 |
Teclado/Teclado numérico | Apóstrofo e aspas duplas | 0x0007 | 0x0034 | 0x0028 | 41 |
Teclado/Teclado numérico | Acento grave e tilde do teclado | 0x0007 | 0x0035 | 0x0029 | 1 |
Teclado/Teclado numérico | Vírgula de Teclado e LessThan | 0x0007 | 0x0036 | 0x0033 | 53 |
Teclado/Teclado numérico | Período de Teclado e GreaterThan | 0x0007 | 0x0037 | 0x0034 | 54 |
Teclado/Teclado numérico | Teclado ForwardSlash e QuestionMark | 0x0007 | 0x0038 | 0x0035 | 55 |
Teclado/Teclado numérico | Bloqueio de tampas de teclado | 0x0007 | 0x0039 | 0x003A | 30 |
Teclado/Teclado numérico | Teclado F1 | 0x0007 | 0x003A | Código hexadecimal: 0x003B | 112 |
Teclado/Teclado numérico | Teclado F2 | 0x0007 | 0x003B | 0x003C | 113 |
Teclado/Teclado numérico | Teclado F3 | 0x0007 | 0x003C | 0x003D | 114 |
Teclado/Teclado numérico | Teclado F4 | 0x0007 | 0x003D | 0x003E | 115 |
Teclado/Teclado numérico | Teclado F5 | 0x0007 | 0x003E | 0x003F | 116 |
Teclado/Teclado numérico | Teclado F6 | 0x0007 | 0x003F | 0x0040 | 117 |
Teclado/Teclado numérico | Teclado F7 | 0x0007 | 0x0040 | 0x0041 | 118 |
Teclado/Teclado numérico | Teclado F8 | 0x0007 | 0x0041 | 0x0042 | 119 |
Teclado/Teclado numérico | Teclado F9 | 0x0007 | 0x0042 | 0x0043 | 120 |
Teclado/Teclado numérico | Teclado F10 | 0x0007 | 0x0043 | 0x0044 | 121 |
Teclado/Teclado numérico | Teclado F11 | 0x0007 | 0x0044 | 0x0057 | 122 |
Teclado/Teclado numérico | Teclado F12 | 0x0007 | 0x0045 | 0x0058 | 123 |
Teclado/Teclado numérico | PrintScreen do Teclado | 0x0007 | 0x0046 | 0xE037 0x0054 *Observação 1 |
124 |
Teclado/Teclado numérico | Bloqueio de rolagem do teclado | 0x0007 | 0x0047 | 0x0046 | 125 |
Teclado/Teclado numérico | Pausa do teclado | 0x0007 | 0x0048 | 0xE11D45 0xE046 *Observação 2 0x0045 *Observação 3 |
126 |
Teclado/Teclado numérico | Inserção de teclado | 0x0007 | 0x0049 | 0xE052 | 75 |
Teclado/Teclado numérico | Página Inicial do Teclado | 0x0007 | 0x004A | 0xE047 | 80 |
Teclado/Teclado numérico | PageUp de teclado | 0x0007 | 0x004B | 0xE049 | 85 |
Teclado/Teclado numérico | Exclusão de teclado para frente | 0x0007 | 0x004C | 0xE053 | 76 |
Teclado/Teclado numérico | Fim do teclado | 0x0007 | 0x004D | 0xE04F | 81 |
Teclado/Teclado numérico | Avançar Página do Teclado | 0x0007 | 0x004E | 0xE051 | 86 |
Teclado/Teclado numérico | Teclado RightArrow | 0x0007 | 0x004F | 0xE04D | 89 |
Teclado/Teclado numérico | LeftArrow do teclado | 0x0007 | 0x0050 | 0xE04B | 79 |
Teclado/Teclado numérico | Seta para baixo do teclado | 0x0007 | 0x0051 | 0xE050 | 84 |
Teclado/Teclado numérico | Tecla de seta para cima do teclado | 0x0007 | 0x0052 | 0xE048 | 83 |
Teclado/Teclado numérico | Teclado Num Lock e Clear | 0x0007 | 0x0053 | 0x0045 0xE045 *Observação 3 |
90 |
Teclado/Teclado numérico | Barra de avanço do teclado | 0x0007 | 0x0054 | 0xE035 | 95 |
Teclado/Teclado numérico | Estrela do teclado | 0x0007 | 0x0055 | 0x0037 | 100 |
Teclado/Teclado numérico | Traço do teclado | 0x0007 | 0x0056 | 0x004A | 105 |
Teclado/Teclado numérico | Teclado Numérico Plus | 0x0007 | 0x0057 | 0x004E | 106 |
Teclado/Teclado numérico | Teclado ENTER | 0x0007 | 0x0058 | 0xE01C | 108 |
Teclado/Teclado numérico | Teclado numérico 1 e Fim | 0x0007 | 0x0059 | 0x004F | 93 |
Teclado/Teclado numérico | Teclado 2 e Seta para baixo | 0x0007 | 0x005A | 0x0050 | 98 |
Teclado/Teclado numérico | Teclado 3 e PageDn | 0x0007 | 0x005B | 0x0051 | 103 |
Teclado/Teclado numérico | Tecla 4 e Seta Esquerda | 0x0007 | 0x005C | 0x004B | 92 |
Teclado/Teclado numérico | Teclado 5 | 0x0007 | 0x005D | 0x004C | 97 |
Teclado/Teclado numérico | Teclado numérico 6 e Seta para a direita | 0x0007 | 0x005E | 0x004D | 102 |
Teclado/Teclado numérico | Teclado 7 e Página Inicial | 0x0007 | 0x005F | 0x0047 | 91 |
Teclado/Teclado numérico | Teclado 8 e Seta para cima | 0x0007 | 0x0060 | 0x0048 | 96 |
Teclado/Teclado numérico | Tecla 9 e PageUp | 0x0007 | 0x0061 | 0x0049 | 101 |
Teclado/Teclado numérico | Teclado 0 e Inserir | 0x0007 | 0x0062 | 0x0052 | 99 |
Teclado/Teclado numérico | Período e exclusão do teclado | 0x0007 | 0x0063 | 0x0053 | 104 |
Teclado/Teclado numérico | Teclado com tecla de barra invertida e pipe em layout não americano | 0x0007 | 0x0064 | 0x0056 | 45 |
Teclado/Teclado numérico | Aplicativo de teclado | 0x0007 | 0x0065 | 0xE05D | 129 |
Teclado/Teclado numérico | Poder do teclado | 0x0007 | 0x0066 | 0xE05E | |
Teclado/Teclado numérico | Teclado é Igual | 0x0007 | 0x0067 | 0x0059 | |
Teclado/Teclado numérico | Teclado F13 | 0x0007 | 0x0068 | 0x0064 | |
Teclado/Teclado numérico | Teclado F14 | 0x0007 | 0x0069 | 0x0065 | |
Teclado/Teclado numérico | Teclado F15 | 0x0007 | 0x006A | 0x0066 | |
Teclado/Teclado numérico | Teclado F16 | 0x0007 | 0x006B | 0x0067 | |
Teclado/Teclado numérico | Teclado F17 | 0x0007 | 0x006C | 0x0068 | |
Teclado/Teclado numérico | Teclado F18 | 0x0007 | 0x006D | 0x0069 | |
Teclado/Teclado numérico | Teclado F19 | 0x0007 | 0x006E | 0x006A | |
Teclado/Teclado numérico | Teclado F20 | 0x0007 | 0x006F | 0x006B | |
Teclado/Teclado numérico | Teclado F21 | 0x0007 | 0x0070 | 0x006C | |
Teclado/Teclado numérico | Teclado F22 | 0x0007 | 0x0071 | 0x006D | |
Teclado/Teclado numérico | Teclado F23 | 0x0007 | 0x0072 | 0x006E | |
Teclado/Teclado numérico | Teclado F24 | 0x0007 | 0x0073 | 0x0076 | |
Teclado/Teclado numérico | Vírgula do teclado | 0x0007 | 0x0085 | 0x007E | 107 *Observação 4 |
Teclado/Teclado numérico | Teclado Internacional1 | 0x0007 | 0x0087 | 0x0073 | 56 *Observação 4, 5 |
Teclado/Teclado numérico | Teclado Internacional2 | 0x0007 | 0x0088 | 0x0070 | 133 *Observação 5 |
Teclado/Teclado numérico | Teclado Internacional3 | 0x0007 | 0x0089 | 0x007D | 14 *Observação 5 |
Teclado/Teclado numérico | Teclado International4 | 0x0007 | 0x008A | 0x0079 | 132 *Observação 5 |
Teclado/Teclado numérico | Teclado International5 | 0x0007 | 0x008B | 0x007B | 131 *Observação 5 |
Teclado/Teclado numérico | Teclado International6 | 0x0007 | 0x008C | 0x005C | |
Teclado/Teclado numérico | TECLADO LANG1 | 0x0007 | 0x0090 | 0x0072 *Observação 6 0x00F2 *Observação 3, 6 |
|
Teclado/Teclado numérico | Teclado LANG2 | 0x0007 | 0x0091 | 0x0071 *Observação 6 0x00F1 *Observação 3, 6 |
|
Teclado/Teclado numérico | Teclado LANG3 | 0x0007 | 0x0092 | 0x0078 | |
Teclado/Teclado numérico | Teclado LANG4 | 0x0007 | 0x0093 | 0x0077 | |
Teclado/Teclado numérico | Teclado LANG5 | 0x0007 | 0x0094 | 0x0076 | |
Teclado/Teclado numérico | Tecla Ctrl Esquerdo do teclado | 0x0007 | 0x00E0 | 0x001D | 58 |
Teclado/Teclado numérico | Teclado LeftShift | 0x0007 | 0x00E1 | 0x002A | 44 |
Teclado/Teclado numérico | Teclado LeftAlt | 0x0007 | 0x00E2 | 0x0038 | 60 |
Teclado/Teclado numérico | GUI à esquerda do teclado | 0x0007 | 0x00E3 | 0xE05B | 127 |
Teclado/Teclado numérico | Tecla Ctrl Direita | 0x0007 | 0x00E4 | 0xE01D | 64 |
Teclado/Teclado numérico | Teclado RightShift | 0x0007 | 0x00E5 | 0x0036 | 57 |
Teclado/Teclado numérico | Alt Direito do teclado | 0x0007 | 0x00E6 | 0xE038 | 62 |
Teclado/Teclado numérico | GUI à direita do teclado | 0x0007 | 0x00E7 | 0xE05C | 128 |
Consumidor | Avançar para a Próxima Faixa | 0x000C | 0x00B5 | 0xE019 | |
Consumidor | Verificação da faixa anterior | 0x000C | 0x00B6 | 0xE010 | |
Consumidor | Parar | 0x000C | 0x00B7 | 0xE024 | |
Consumidor | Reproduzir/pausar | 0x000C | 0x00CD | 0xE022 | |
Consumidor | Silenciar | 0x000C | 0x00E2 | 0xE020 | |
Consumidor | Incremento de volume | 0x000C | 0x00E9 | 0xE030 | |
Consumidor | Redução de volume | 0x000C | 0x00EA | 0xE02E | |
Consumidor | Configuração de Controle do Usuário para AL | 0x000C | 0x0183 | 0xE06D | |
Consumidor | Leitor de Email AL | 0x000C | 0x018A | 0xE06C | |
Consumidor | Calculadora de AL | 0x000C | 0x0192 | 0xE021 | |
Consumidor | Navegador de Máquina Local AL | 0x000C | 0x0194 | 0xE06B | |
Consumidor | Pesquisa AC | 0x000C | 0x0221 | 0xE065 | |
Consumidor | AC Casa | 0x000C | 0x0223 | 0xE032 | |
Consumidor | AC Traseira | 0x000C | 0x0224 | 0xE06A | |
Consumidor | "AC Forward" | 0x000C | 0x0225 | 0xE069 | |
Consumidor | Parada do Ar Condicionado | 0x000C | 0x0226 | 0xE068 | |
Consumidor | Atualização do AC | 0x000C | 0x0227 | 0xE067 | |
Consumidor | Marcadores AC | 0x000C | 0x022A | 0xE066 |
Observações:
- O código de verificação de chave SysRq é emitido no pressionamento de tecla Alt+Imprimir tela
- O código de verificação de tecla de interrupção é emitido ao pressionar Ctrl+Pause
- Como visto em mensagens de teclado herdadas
- A tecla está presente nos teclados brasileiros
- A tecla está presente em teclados japoneses
- O código de varredura é emitido somente no evento de liberação de tecla
Sinalizador Extended-Key
O sinalizador de tecla expandida indica se a mensagem de pressionamento de tecla se originou de uma das teclas adicionais no teclado avançado de 101/102 teclas. As teclas estendidas consistem nas teclas Alt e Ctrl no lado direito do teclado; as teclas Insert*, Delete*, Home, End, Page up, Page down e Arrow nos clusters à esquerda do teclado numérico; a chave de bloqueio Num ; a tecla Break (Ctrl+Pause) ; a tecla Imprimir tela ; e as teclas Divide (/) e Enter no teclado numérico. A tecla Shift à direita não é considerada uma chave estendida, ela tem um código de verificação separado.
Se especificado, o código de verificação consiste em uma sequência de dois bytes, em que o primeiro byte tem um valor de 0xE0.
Código de contexto
O código de contexto indica se a chave Alt estava inativa quando a mensagem de pressionamento de tecla foi gerada. O código será 1 se a chave Alt estiver inoperante e 0 se estiver ativada.
Sinal Key-State anterior
O sinalizador de estado-chave anterior indica se a chave que gerou a mensagem de pressionamento de tecla estava anteriormente para cima ou para baixo. Será 1 se a tecla tiver sido pressionada anteriormente e 0 se a tecla tiver sido liberada anteriormente. Você pode usar esse sinalizador para identificar mensagens de pressionamento de tecla geradas pelo recurso de repetição automática do teclado. Esse sinalizador é definido como 1 para WM_KEYDOWN e WM_SYSKEYDOWN mensagens de pressionamento de tecla geradas pelo recurso de repetição automática. Ele é sempre definido como 1 para mensagens WM_KEYUP e WM_SYSKEYUP .
Sinalizador Transition-State
O sinalizador de estado de transição indica se pressionar uma chave ou liberar uma chave gerou a mensagem de pressionamento de tecla. Esse sinalizador é sempre definido como 0 para mensagens WM_KEYDOWN e WM_SYSKEYDOWN ; é sempre definido como 1 para mensagens WM_KEYUP e WM_SYSKEYUP .
Mensagens de Personagem
As mensagens de pressionamento de tecla fornecem muitas informações sobre pressionamentos de tecla, mas não fornecem códigos de caractere para pressionamentos de teclas de caractere. Para recuperar códigos de caractere, um aplicativo deve incluir a função TranslateMessage em seu loop de mensagem de thread. TranslateMessage envia uma mensagem WM_KEYDOWN ou WM_SYSKEYDOWN para o layout do teclado. O layout examina o código de chave virtual da mensagem e, se corresponder a uma chave de caractere, fornece o equivalente de código de caractere (levando em conta o estado das teclas Shift e Caps Lock ). Em seguida, ele gera uma mensagem de caractere que inclui o código de caractere e coloca a mensagem na parte superior da fila de mensagens. A próxima iteração do loop de mensagens remove a mensagem de caractere da fila e despacha a mensagem para o procedimento de janela apropriado.
Esta seção contém os seguintes tópicos:
Mensagens de caracteres não reconhecidos pelo sistema
Um procedimento de janela pode receber as seguintes mensagens de caractere: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR e WM_UNICHAR. A função TranslateMessage gera uma mensagem de WM_CHAR ou WM_DEADCHAR quando processa uma mensagem de WM_KEYDOWN . Da mesma forma, ele gera uma mensagem de WM_SYSCHAR ou WM_SYSDEADCHAR quando processa uma mensagem de WM_SYSKEYDOWN .
Um aplicativo que processa a entrada de teclado normalmente ignora todas as mensagens, exceto as WM_CHAR e WM_UNICHAR, enviando todas as outras mensagens para a função DefWindowProc. Observe que WM_CHAR usa UTF-16 (formato de transformação Unicode de 16 bits) ou conjunto de caracteres ANSI enquanto WM_UNICHAR sempre usa UTF-32 (Formato de Transformação Unicode de 32 bits). O sistema usa as mensagens WM_SYSCHAR e WM_SYSDEADCHAR para implementar mnemônicos de menu.
O parâmetro wParam de todas as mensagens de caractere contém o código de caractere da tecla de caractere que foi pressionada. O valor do código de caractere depende da classe de janela da janela que recebe a mensagem. Se a versão Unicode da função RegisterClass foi usada para registrar a classe de janela, o sistema fornece caracteres Unicode para todas as janelas dessa classe. Caso contrário, o sistema fornece códigos de caractere ANSI. Para obter mais informações, consulte Registrar classes de janela e usar páginas de código UTF-8 em aplicativos do Windows.
O conteúdo do parâmetro lParam de uma mensagem de caractere é idêntico ao conteúdo do parâmetro lParam da mensagem de pressionamento de tecla que foi interpretada para gerar a mensagem de caractere. Para obter informações, consulte Sinalizadores de Mensagem de Pressionamento de Teclas.
Mensagens Dead-Character
Alguns teclados que não são em inglês contêm teclas de caractere que não devem produzir caracteres sozinhos. Em vez disso, eles são usados para adicionar um diacrítico ao caractere produzido pelo pressionamento de tecla subsequente. Essas chaves são chamadas chaves mortas. A tecla circunflexa em um teclado alemão é um exemplo de uma tecla morta. Para inserir o caractere que consiste em um "o" com um circunflexo, um usuário alemão digitaria a chave circunflexa seguida pela chave "o". A janela com o foco do teclado receberia a seguinte sequência de mensagens:
TranslateMessage gera a mensagem WM_DEADCHAR quando processa a mensagem WM_KEYDOWN de uma chave morta. Embora o parâmetro wParam da mensagem WM_DEADCHAR contenha o código de caractere do diacrítico para a chave morta, um aplicativo normalmente ignora a mensagem. Em vez disso, ele processa a mensagem de WM_CHAR gerada pelo pressionamento de tecla subsequente. O parâmetro wParam da mensagem WM_CHAR contém o código de caractere da letra com o diacrítico. Se o pressionamento de tecla subsequente gerar um caractere que não pode ser combinado com um diacrítico, o sistema gerará duas mensagens WM_CHAR . O parâmetro wParam do primeiro contém o código de caractere do diacrítico; o parâmetro wParam do segundo contém o código de caractere da chave de caractere subsequente.
A função TranslateMessage gera a mensagem WM_SYSDEADCHAR quando processa a mensagem WM_SYSKEYDOWN de uma chave morta do sistema (uma tecla morta que é pressionada em combinação com a tecla Alt ). Normalmente, um aplicativo ignora a mensagem de WM_SYSDEADCHAR .
Status da chave
Ao processar uma mensagem de teclado, um aplicativo pode precisar determinar o status de outra chave além daquela que gerou a mensagem atual. Por exemplo, um aplicativo de processamento de palavras que permite que o usuário pressione Shift+End para selecionar um bloco de texto deve verificar o status da tecla Shift sempre que receber uma mensagem de pressionamento de tecla da tecla End . O aplicativo pode usar a função GetKeyState para determinar o status de uma chave virtual no momento em que a mensagem atual foi gerada; ele pode usar a função GetAsyncKeyState para recuperar o status atual de uma chave virtual.
Algumas teclas são consideradas teclas de alternância que alteram o estado do layout do teclado. As teclas de alternância geralmente incluem teclas Caps Lock (VK_CAPITAL), Num Lock (VK_NUMLOCK) e Scroll Lock (VK_SCROLL). A maioria dos teclados tem indicadores LED correspondentes para essas teclas.
O layout do teclado mantém uma lista de nomes. O nome de uma chave que produz um único caractere é o mesmo que o caractere produzido pela chave. O nome de uma chave não caracter, como Tab e Enter , é armazenado como uma cadeia de caracteres. Um aplicativo pode recuperar o nome de qualquer chave do layout do teclado chamando a função GetKeyNameText .
Pressionamento de teclas e traduções de caracteres
O sistema inclui várias funções de finalidade especial que traduzem códigos de verificação, códigos de caractere e códigos de chave virtual fornecidos por várias mensagens de pressionamento de tecla. Essas funções incluem MapVirtualKey, ToAscii, ToUnicode e VkKeyScan.
Microsoft Rich Edit 3.0 dá suporte ao HexToUnicode IME, que permite ao usuário converter caracteres entre hexadecimal e Unicode usando teclas de atalho. Isso significa que, quando o Microsoft Rich Edit 3.0 for incorporado a um aplicativo, o aplicativo herdará os recursos do IME hexToUnicode.
Suporte Hot-Key
Uma tecla de atalho é uma combinação de teclas que gera uma mensagem WM_HOTKEY, uma mensagem que o sistema coloca na parte superior da fila de mensagens de um thread, ignorando as mensagens existentes na fila. Os aplicativos usam teclas de atalho para obter entrada de teclado de alta prioridade do usuário. Por exemplo, definindo uma chave dinâmica que consiste no pressionamento de tecla Ctrl+C , um aplicativo pode permitir que o usuário cancele uma operação prolongada.
Para definir uma chave ativa, um aplicativo chama a função RegisterHotKey , especificando a combinação de chaves que gera a mensagem WM_HOTKEY , o identificador para a janela para receber a mensagem e o identificador da chave ativa. Quando o usuário pressiona a tecla de atalho, uma mensagem WM_HOTKEY é colocada na fila de mensagens do thread que criou a janela. O parâmetro wParam da mensagem contém o identificador da chave ativa. O aplicativo pode definir várias teclas de acesso para um thread, mas cada chave ativa no thread deve ter um identificador exclusivo. Antes que o aplicativo seja encerrado, ele deve usar a função UnregisterHotKey para destruir a chave ativa.
Os aplicativos podem usar um controle de tecla de atalho para facilitar a escolha de uma tecla de atalho pelo usuário. Controles de teclas de atalho normalmente são usados para definir um atalho que ativa uma janela; eles não usam as funções RegisterHotKey e UnregisterHotKey. Em vez disso, um aplicativo que usa um controle de tecla de atalho normalmente envia a mensagem WM_SETHOTKEY para definir a tecla de atalho. Toda vez que o usuário pressiona a tecla de atalho, o sistema envia uma mensagem WM_SYSCOMMAND especificando SC_HOTKEY. Para obter mais informações sobre controles de teclas frequentes, consulte "Usando controles de teclas frequentes" em controles de teclas frequentes.
Teclas de teclado para navegação e outras funções
O Windows oferece suporte para teclados com chaves especiais para funções de navegador, funções de mídia, inicialização de aplicativos e gerenciamento de energia. O WM_APPCOMMAND dá suporte às teclas de teclado extras. Além disso, a função ShellProc é modificada para dar suporte às teclas de teclado extras.
É improvável que uma janela filha em um aplicativo de componente seja capaz de implementar comandos diretamente para essas teclas de teclado extras. Portanto, quando uma dessas teclas é pressionada, DefWindowProc enviará uma mensagem de WM_APPCOMMAND para uma janela. DefWindowProc também propagará a mensagem WM_APPCOMMAND para sua janela pai. Isso é semelhante à maneira como os menus de contexto são invocados com o botão direito do mouse, que é que DefWindowProc envia uma mensagem WM_CONTEXTMENU em um clique com o botão direito do mouse e a coloca em bolhas para seu pai. Além disso, se DefWindowProc receber uma mensagem WM_APPCOMMAND para uma janela de nível superior, ele chamará um gancho de shell com o código HSHELL_APPCOMMAND.
O Windows também dá suporte ao Microsoft IntelliMouse Explorer, que é um mouse com cinco botões. Os dois botões extras dão suporte à navegação do navegador para frente e para trás. Para obter mais informações, consulte XBUTTONs.
Simulando entrada
Para simular uma série ininterrupta de eventos de entrada do usuário, use a função SendInput . A função aceita três parâmetros. O primeiro parâmetro, cInputs, indica o número de eventos de entrada que serão simulados. O segundo parâmetro, rgInputs, é uma matriz de estruturas INPUT , cada uma descrevendo um tipo de evento de entrada e informações adicionais sobre esse evento. O último parâmetro, cbSize, aceita o tamanho da estrutura INPUT , em bytes.
A função SendInput funciona injetando uma série de eventos de entrada simulados no fluxo de entrada de um dispositivo. O efeito é semelhante a chamar a função keybd_event ou mouse_event repetidamente, exceto que o sistema garante que nenhum outro evento de entrada intercale com os eventos simulados. Quando a chamada for concluída, o valor retornado indicará o número de eventos de entrada executados com êxito. Se esse valor for zero, a entrada será bloqueada.
A função SendInput não redefine o estado atual do teclado. Portanto, se o usuário tiver teclas pressionadas ao chamar essa função, ele poderá interferir nos eventos gerados por essa função. Se você estiver preocupado com possíveis interferências, verifique o estado do teclado com a função GetAsyncKeyState e corrija conforme necessário.
Idiomas, localidades e layouts de teclado
Um idioma é natural, como inglês, francês e japonês. Uma sublíngua é uma variante de uma língua natural que é falada em uma região geográfica específica, como as sublínguas do inglês faladas no Reino Unido e nos Estados Unidos. Os aplicativos usam valores, chamados de identificadores de idioma, para identificar exclusivamente idiomas e sublanguages.
Normalmente, os aplicativos usam localidades para definir o idioma no qual a entrada e a saída são processadas. Definir a localidade do teclado, por exemplo, afeta os valores de caractere gerados pelo teclado. Definir a localidade para a exibição ou impressora afeta os glifos exibidos ou impressos. Os aplicativos definem a localidade de um teclado carregando e usando layouts de teclado. Eles definem a localidade para uma exibição ou impressora selecionando uma fonte que dá suporte à localidade especificada.
Um layout de teclado não só especifica a posição física das teclas no teclado, mas também determina os valores de caractere gerados pressionando essas teclas. Cada layout identifica o idioma de entrada atual e determina quais valores de caractere são gerados por quais chaves e combinações de chaves.
Cada layout de teclado tem um identificador correspondente que identifica o layout e o idioma. A parte inferior do manipulador é um identificador de idioma. O termo "high word" é um identificador de dispositivo, que especifica o layout físico, ou pode ser zero, indicando um layout padrão. O usuário pode associar qualquer idioma de entrada a um layout físico. Por exemplo, um usuário de língua inglesa que trabalha muito ocasionalmente em francês pode definir o idioma de entrada do teclado como francês sem alterar o layout físico do teclado. Isso significa que o usuário pode inserir texto em francês usando o layout em inglês familiar.
Geralmente, não se espera que os aplicativos manipulem idiomas de entrada diretamente. Em vez disso, o usuário configura combinações de idioma e layout e alterna entre elas. Quando o usuário clica no texto marcado com um idioma diferente, o aplicativo chama a função ActivateKeyboardLayout para ativar o layout padrão do usuário para esse idioma. Se o usuário editar o texto em um idioma que não está na lista ativa, o aplicativo poderá chamar a função LoadKeyboardLayout com o idioma para obter um layout com base nesse idioma.
A função ActivateKeyboardLayout define o idioma de entrada para a tarefa atual. O parâmetro hkl pode ser a referência para o layout do teclado ou um identificador de idioma com extensão zero. Os identificadores de layout do teclado podem ser obtidos da função LoadKeyboardLayout ou GetKeyboardLayoutList . Os valores HKL_NEXT e HKL_PREV também podem ser usados para selecionar o teclado seguinte ou anterior.
A função GetKeyboardLayoutName recupera o nome do layout de teclado ativo para o thread de chamada. Se um aplicativo criar o layout ativo usando a função LoadKeyboardLayout , GetKeyboardLayoutName recuperará a mesma cadeia de caracteres usada para criar o layout. Caso contrário, a cadeia de caracteres é o identificador de idioma primário correspondente à localidade do layout ativo. Isso significa que a função pode não necessariamente diferenciar entre layouts diferentes com o mesmo idioma primário, portanto, não é possível retornar informações específicas sobre o idioma de entrada. No entanto, a função GetKeyboardLayout pode ser usada para determinar o idioma de entrada.
A função LoadKeyboardLayout carrega um layout de teclado e disponibiliza o layout para o usuário. Os aplicativos podem tornar o layout imediatamente ativo para o thread atual usando o valor KLF_ACTIVATE . Um aplicativo pode usar o valor KLF_REORDER para reordenar os layouts sem especificar também o valor KLF_ACTIVATE . Os aplicativos sempre devem usar o valor KLF_SUBSTITUTE_OK ao carregar layouts de teclado para garantir que a preferência do usuário, se houver, esteja selecionada.
Para suporte multilíngue, a função LoadKeyboardLayout fornece os sinalizadores KLF_REPLACELANG e KLF_NOTELLSHELL . O sinalizador KLF_REPLACELANG direciona a função para substituir um layout de teclado existente sem alterar o idioma. Tentar substituir um layout existente usando o mesmo identificador de idioma, mas sem especificar KLF_REPLACELANG é um erro. O sinalizador KLF_NOTELLSHELL impede que a função notifique o shell quando um layout de teclado é adicionado ou substituído. Isso é útil para aplicativos que adicionam vários layouts em uma série consecutiva de chamadas. Esse sinalizador deve ser usado em todas as chamadas, exceto na última.
A função UnloadKeyboardLayout é restrita, pois não pode descarregar o idioma de entrada padrão do sistema. Isso garante que o usuário sempre tenha um layout disponível para inserir texto usando o mesmo conjunto de caracteres usado pelo shell e pelo sistema de arquivos.