Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 de teclado independente do dispositivo para aplicativos instalando um driver de dispositivo de teclado apropriado para o teclado atual. O sistema fornece suporte de teclado independente de idioma usando o layout de teclado específico do idioma atualmente selecionado pelo usuário ou pelo aplicativo. O driver de dispositivo do teclado recebe códigos de varredura do teclado, que são enviados para o layout do teclado, onde são traduzidos em mensagens e transmitidas para as janelas apropriadas na sua aplicação.
A cada tecla num teclado está atribuído um valor exclusivo chamado código de varredura, que é um identificador dependente do dispositivo. Um teclado gera dois códigos de verificação quando o usuário digita uma tecla — um quando o usuário pressiona a tecla e outro quando o usuário libera a tecla.
O driver de dispositivo do teclado interpreta um código de digitalização e o traduz (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 de chave virtual e outras informações sobre o pressionamento de tecla 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 mensagens 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. A de foco do teclado é uma propriedade temporária de uma janela. O sistema partilha o teclado entre todas as janelas do ecrã, mudando o foco do teclado, na direção do utilizador, 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 do teclado até que o foco mude para uma janela diferente.
Uma thread pode chamar a função GetFocus para determinar qual das suas janelas (se houver) tem atualmente o foco do teclado. Um thread pode dar o foco do teclado a uma de suas janelas chamando a funçãoSetFocus. 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, em seguida, envia uma mensagem WM_SETFOCUS para a janela que ganhou o foco.
O conceito de foco do teclado está relacionado com o da janela ativa. A janela ativa é a janela principal com que o utilizador está a interagir atualmente. 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 no topo da ordem Z e destaca sua barra de título (se tiver uma) e borda.
O usuário pode ativar uma janela de nível superior clicando nela, selecionando-a usando a Alt+Tab ou combinação de teclas Alt+Esc ou selecionando-a na Lista de Tarefas. Uma thread pode ativar uma janela de nível superior usando a função SetActiveWindow . Ele pode determinar se uma janela de nível superior criada está ativa usando a funçãoGetActiveWindow.
Quando uma janela é desativada e outra ativada, o sistema envia a mensagem WM_ACTIVATE. A palavra de ordem baixa do parâmetro wParam é 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 alcancem aplicativos, use BlockInput. Observe que a função BlockInput não interferirá com a tabela de estado de entrada assíncrona do teclado. Isso significa que chamar a função SendInput enquanto a entrada estiver bloqueada alterará a tabela de estado de entrada assíncrona do teclado.
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. Liberar uma chave faz com que uma mensagem WM_KEYUP ou WM_SYSKEYUP seja colocada na fila.
As mensagens de pressionamento e liberação de tecla normalmente ocorrem em pares, mas se o utilizador pressionar uma tecla por tempo suficiente para iniciar o recurso de repetição automática do teclado, o sistema gerará várias mensagens WM_KEYDOWN ou WM_SYSKEYDOWN em sequência. Em seguida, gera uma única mensagem WM_KEYUP ou WM_SYSKEYUP quando o usuário libera a chave.
Esta secção abrange os seguintes tópicos:
Toques de tecla do sistema e fora do sistema
O sistema faz uma distinção entre pressionamentos de teclas do sistema e pressionamentos de teclas não-sistema. As teclas pressionadas pelo sistema produzem mensagens de pressionamento de teclas do sistema, WM_SYSKEYDOWN e WM_SYSKEYUP. Pressionamentos de teclas que não são do sistema produzem mensagens de pressionamento de teclas que não são do sistema, WM_KEYDOWN e WM_KEYUP.
Se o procedimento da janela tiver de processar uma mensagem de pressionamento de tecla do sistema, certifique-se de que, depois de processar a mensagem, o procedimento passe a mensagem para a função DefWindowProc. Caso contrário, todas as operações do sistema que envolvam a tecla Alt serão desativadas 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 Alt+Esc ou Alt+Tab pressionamento de tecla para ativar uma janela diferente.
As mensagens de pressionamento de tecla do sistema são principalmente para uso pelo sistema e não por um aplicativo. O sistema usa-os para fornecer sua interface de teclado embutido para 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 que não são do sistema são para uso por janelas de aplicativos; a função DefWindowProc não faz nada com eles. Um procedimento de janela pode descartar quaisquer mensagens de pressionamento de tecla que não sejam do sistema e que não sejam necessárias.
Códigos de Tecla Virtual Descritos
O parâmetro wParam de uma mensagem de pressionamento de tecla contém o código de chave virtual da tecla que foi pressionada ou liberada. Um procedimento de janela processa ou ignora uma mensagem de pressionamento de teclas, 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 recebe e ignora o resto. Por exemplo, um procedimento de janela pode processar apenas mensagens de pressionamento de tecla WM_KEYDOWN e somente aquelas que contêm códigos de teclas virtuais para as teclas de movimento do cursor, teclas de modificação e teclas de função. Um procedimento de janela típico não processa mensagens de pressionamento de tecla de teclas de caracteres. Em vez disso, ele usa a função TranslateMessage para converter a mensagem em mensagens de caracteres. Para obter mais informações sobre TranslateMessage e mensagens de caracteres, consulte Character Messages.
Indicadores de mensagem de pressão 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 varredura , 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 alta ordem do lParam.
| Valor | Descrição |
|---|---|
|
KF_EXTENDED 0x0100 |
Manipula o sinalizador estendido de chave . |
|
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 de tecla anterior . |
|
KF_UP 0x8000 |
Manipula a bandeira 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ção
Você pode verificar a contagem de repetições 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 mantém pressionada uma tecla por tempo suficiente para iniciar o recurso de repetição automática do teclado. Ao invés de preencher a fila de mensagens do sistema com as mensagens de tecla pressionada resultantes, o sistema combina as mensagens em uma única mensagem de tecla pressionada e incrementa a contagem de repetição. Liberar uma chave não pode iniciar o recurso de repetição automática, portanto, a contagem de repetições para mensagens WM_KEYUP e WM_SYSKEYUP é sempre definida como 1.
Códigos de Escaneamento
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 de 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 teclas.
Os teclados modernos estão a usar a especificação de Dispositivos de Interface Humana (HID) para comunicar com um computador. O driver de teclado converte os valores de utilização HID relatados enviados do teclado em códigos de scan e os passa para as aplicações.
Observação
Embora os códigos de teclas virtuais sejam normalmente mais úteis para aplicações de desktop, pode ser necessário utilizar códigos de escaneamento em casos específicos quando é preciso saber qual tecla é pressionada, independentemente do layout de teclado atual. Por exemplo, as ligações de teclas WASD (W aponta para cima, A à esquerda, S para baixo e D à direita) para jogos, que garantem uma formação de teclas consistente nos layouts de teclado QWERTY dos EUA ou AZERTY francês.
A tabela a seguir lista o conjunto de códigos de scan atualmente reconhecidos pelo Windows. Página de Uso do HID/Nome de Uso do HID/Referência aos valores de no documento Tabelas de Uso do HID . Os valores Key Location fazem referência à imagem de teclado anterior.
O código Scan 1 Make é transmitido nas mensagens WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP e WM_INPUT.
| Nome da página de uso do HID | Nome de Utilização HID | Página de Utilização do HID | ID de uso HID | Digitalizar 1 Make | Localização chave |
|---|---|---|---|---|---|
| Desktop Genérico | Desligamento do sistema | 0x0001 | 0x0081 | 0xE05E | |
| Desktop Genérico | Modo de Suspensão do Sistema | 0x0001 | 0x0082 | 0xE05F | |
| Desktop Genérico | Despertar do sistema | 0x0001 | 0x0083 | 0xE063 | |
| Teclado/Teclado Numérico | ErrorRollOver | 0x0007 | 0x0001 | 0x00FF | |
| Teclado/Teclado Numérico | 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 | 25 |
| 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 | 23 |
| 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 AT | 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 5 e Percentagem | 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 | 8 |
| 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 | Teclado Return Enter | 0x0007 | 0x0028 | 0x001C | 43 |
| Teclado/Teclado Numérico | Fuga do teclado | 0x0007 | 0x0029 | 0x0001 | 110 |
| Teclado/Teclado Numérico | Tecla Delete | 0x0007 | 0x002A | 0x000E | 15 |
| Teclado/Teclado Numérico | Tecla Tab | 0x0007 | 0x002B | 0x000F | 16 |
| Teclado/Teclado Numérico | Barra de espaço do teclado | 0x0007 | 0x002C | 0x0039 | 61 |
| Teclado/Teclado Numérico | Traço-hífens e sublinhado do teclado | 0x0007 | 0x002D | 0x000C | 12 |
| Teclado/Teclado Numérico | Teclado igual e mais | 0x0007 | 0x002E | 0x000D | 13 |
| Teclado/Teclado Numérico | Teclado Chave Esquerda | 0x0007 | 0x002F | 0x001A | 27 |
| Teclado/Teclado Numérico | Teclado Colchete Direito | 0x0007 | 0x0030 | 0x001B | 28 |
| Teclado/Teclado Numérico | Tecla de barra invertida e pipe | 0x0007 | 0x0031 | 0x002B | 29 |
| Teclado/Teclado Numérico | Teclado não-EUA hash e tilde | 0x0007 | 0x0032 | 0x002B | 42 |
| Teclado/Teclado Numérico | Teclado Semicolon e Colon | 0x0007 | 0x0033 | 0x0027 | 40 |
| Teclado/Teclado Numérico | Apóstrofo do teclado e aspas duplas | 0x0007 | 0x0034 | 0x0028 | 41 |
| Teclado/Teclado Numérico | Teclado Grave Accent e Tilde | 0x0007 | 0x0035 | 0x0029 | 1 |
| Teclado/Teclado Numérico | Teclado Vírgula e LessThan | 0x0007 | 0x0036 | 0x0033 | 53 |
| Teclado/Teclado Numérico | Período do teclado e SuperiorMais do que | 0x0007 | 0x0037 | 0x0034 | 54 |
| Teclado/Teclado Numérico | Teclado ForwardSlash e QuestionMark | 0x0007 | 0x0038 | 0x0035 | 55 |
| Teclado/Teclado Numérico | Teclado Caps Lock | 0x0007 | 0x0039 | 0x003A | 30 |
| Teclado/Teclado Numérico | Teclado F1 | 0x0007 | 0x003A | 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 | cento e vinte |
| 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 | Tecla Imprimir Ecrã | 0x0007 | 0x0046 | 0xE037 0x0054 *Nota 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 *Nota 2 0x0045 *Nota 3 |
126 |
| Teclado/Teclado Numérico | Inserção do teclado | 0x0007 | 0x0049 | 0xE052 | 75 |
| Teclado/Teclado Numérico | Página inicial do teclado | 0x0007 | 0x004A | 0xE047 | 80 |
| Teclado/Teclado Numérico | PageUp do teclado | 0x0007 | 0x004B | 0xE049 | 85 |
| Teclado/Teclado Numérico | Tecla Apagar à Frente | 0x0007 | 0x004C | 0xE053 | 76 |
| Teclado/Teclado Numérico | Extremidade do teclado | 0x0007 | 0x004D | 0xE04F | 81 |
| Teclado/Teclado Numérico | Tecla PageDown do teclado | 0x0007 | 0x004E | 0xE051 | 86 |
| Teclado/Teclado Numérico | Seta para a direita do teclado | 0x0007 | 0x004F | 0xE04D | 89 |
| Teclado/Teclado Numérico | Seta para a esquerda do teclado | 0x0007 | 0x0050 | 0xE04B | 79 |
| Teclado/Teclado Numérico | Seta para baixo do teclado | 0x0007 | 0x0051 | 0xE050 | 84 |
| Teclado/Teclado Numérico | Seta para cima do teclado | 0x0007 | 0x0052 | 0xE048 | 83 |
| Teclado/Teclado Numérico | Teclado Num Lock e Clear | 0x0007 | 0x0053 | 0x0045 0xE045 *Nota 3 |
90 |
| Teclado/Teclado Numérico | Barra para a frente do teclado | 0x0007 | 0x0054 | 0xE035 | 95 |
| Teclado/Teclado Numérico | Teclado Estrela | 0x0007 | 0x0055 | 0x0037 | 100 |
| Teclado/Teclado Numérico | Traço do teclado | 0x0007 | 0x0056 | 0x004A | 105 |
| Teclado/Teclado Numérico | Teclado 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 numérico 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 | Tecla 6 e Seta Direita | 0x0007 | 0x005E | 0x004D | 102 |
| Teclado/Teclado Numérico | Teclado 7 e Início | 0x0007 | 0x005F | 0x0047 | 91 |
| Teclado/Teclado Numérico | Teclado 8 e Seta Cima | 0x0007 | 0x0060 | 0x0048 | 96 |
| Teclado/Teclado Numérico | Teclado numérico 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 do teclado e excluir | 0x0007 | 0x0063 | 0x0053 | 104 |
| Teclado/Teclado Numérico | Teclado não-US barra invertida e pipe | 0x0007 | 0x0064 | 0x0056 | 45 |
| Teclado/Teclado Numérico | Aplicação de teclado | 0x0007 | 0x0065 | 0xE05D | 129 |
| Teclado/Teclado Numérico | Potência do teclado | 0x0007 | 0x0066 | 0xE05E | |
| Teclado/Teclado Numérico | Teclado igual a | 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 | Teclado Vírgula | 0x0007 | 0x0085 | 0x007E | 107 *Nota 4 |
| Teclado/Teclado Numérico | Teclado Internacional1 | 0x0007 | 0x0087 | 0x0073 | 56 *Nota 4, 5 |
| Teclado/Teclado Numérico | Teclado Internacional 2 | 0x0007 | 0x0088 | 0x0070 | 133 *Nota 5 |
| Teclado/Teclado Numérico | Teclado Internacional3 | 0x0007 | 0x0089 | 0x007D | 14 *Nota 5 |
| Teclado/Teclado Numérico | Teclado Internacional4 | 0x0007 | 0x008A | 0x0079 | 132 *Nota 5 |
| Teclado/Teclado Numérico | Teclado Internacional5 | 0x0007 | 0x008B | 0x007B | 131 *Nota 5 |
| Teclado/Teclado Numérico | Teclado Internacional6 | 0x0007 | 0x008C | 0x005C | |
| Teclado/Teclado Numérico | Teclado LANG1 | 0x0007 | 0x0090 | 0x0072 *Nota 6 0x00F2 *Nota 3, 6 |
|
| Teclado/Teclado Numérico | Teclado LANG2 | 0x0007 | 0x0091 | 0x0071 *Nota 6 0x00F1 *Nota 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 | Teclado LeftControl | 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 | Tecla GUI esquerda | 0x0007 | 0x00E3 | 0xE05B | 127 |
| Teclado/Teclado Numérico | Teclado RightControl | 0x0007 | 0x00E4 | 0xE01D | 64 |
| Teclado/Teclado Numérico | Teclado RightShift | 0x0007 | 0x00E5 | 0x0036 | 57 |
| Teclado/Teclado Numérico | Teclado RightAlt | 0x0007 | 0x00E6 | 0xE038 | 62 |
| Teclado/Teclado Numérico | GUI do teclado à direita | 0x0007 | 0x00E7 | 0xE05C | 128 |
| Consumidor | Avançar para a próxima faixa | 0x000C | 0x00B5 | 0xE019 | |
| Consumidor | Verificar 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 controlo do consumidor AL | 0x000C | 0x0183 | 0xE06D | |
| Consumidor | AL Leitor de e-mail | 0x000C | 0x018A | 0xE06C | |
| Consumidor | Calculadora AL | 0x000C | 0x0192 | 0xE021 | |
| Consumidor | AL Navegador de máquina local | 0x000C | 0x0194 | 0xE06B | |
| Consumidor | Pesquisa AC | 0x000C | 0x0221 | 0xE065 | |
| Consumidor | AC Início | 0x000C | 0x0223 | 0xE032 | |
| Consumidor | AC Voltar | 0x000C | 0x0224 | 0xE06A | |
| Consumidor | AC Avançado | 0x000C | 0x0225 | 0xE069 | |
| Consumidor | Paragem do Ar Condicionado | 0x000C | 0x0226 | 0xE068 | |
| Consumidor | Atualização do Ar Condicionado | 0x000C | 0x0227 | 0xE067 | |
| Consumidor | Marcadores AC | 0x000C | 0x022A | 0xE066 |
Observações:
- código de verificação de tecla SysRq é emitido ao pressionar Alt+Print Screen
- Interromper código de varredura é emitido na tecla Ctrl+Pausar ação de tecla
- Como visto em mensagens de teclado legadas
- A tecla está presente nos teclados brasileiros
- A tecla está presente nos teclados japoneses
- O código de verificação é emitido apenas no evento de liberação de chave
Indicador de Tecla Estendida
O indicador de tecla estendida indica se a mensagem de pressionamento de tecla se originou de uma das teclas adicionais no teclado de 101/102 teclas Aprimorado. As teclas estendidas consistem nas teclas Alt e Ctrl no lado direito do teclado; o Inserir*, Excluir*, Início, Fim, Página para cima, Página para baixoe teclas de seta nos clusters à esquerda do teclado numérico; a tecla Num lock ; a tecla Break (Ctrl+Pause); a tecla Print screen ; e as teclas Dividir (/) e Enter no teclado numérico. A tecla Shift direita não é considerada uma tecla estendida, pois tem um código de varredura separado.
Se especificado, o código de verificação consiste em uma sequência de dois bytes, onde o primeiro byte tem um valor de 0xE0.
Código de contexto
O código de contexto indica se a tecla Alt estava inativa quando a mensagem de pressionamento de tecla foi gerada. O código é 1 se a tecla Alt estava inativa e 0 se estava ativada.
Bandeira anterior de Key-State
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. É 1 se a tecla estava anteriormente pressionada e 0 se a tecla estava anteriormente levantada. 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 teclas geradas pelo recurso de repetição automática. É sempre definido como 1 para mensagens WM_KEYUP e WM_SYSKEYUP.
Bandeira de Estado de Transição
O sinalizador de estado de transição indica se pressionar uma tecla ou soltar uma tecla gerou a mensagem de pressionamento de teclas. Este sinalizador é sempre definido como 0 para mensagens WM_KEYDOWN e WM_SYSKEYDOWN; é sempre definido como 1 para WM_KEYUP e WM_SYSKEYUP mensagens.
Mensagens de Personagens
As mensagens de pressionamento de tecla fornecem muitas informações sobre pressionamentos de teclas, mas não fornecem códigos de caracteres para pressionamentos de teclas de caracteres. Para recuperar códigos de caracteres, um aplicativo deve incluir a função TranslateMessage em seu loop de mensagem de thread. TranslateMessage passa uma mensagem WM_KEYDOWN ou WM_SYSKEYDOWN para a configuração do teclado. O layout examina o código de chave virtual da mensagem e, se corresponder a uma chave de caractere, fornece o código de caractere equivalente (levando em consideração o estado das teclas Shift e Caps Lock). Em seguida, gera uma mensagem de caractere que inclui o código de caractere e coloca a mensagem na parte superior da fila de mensagens. Na próxima iteração do ciclo de mensagens, a mensagem de caracteres é removida da fila e enviada para o procedimento de janela apropriado.
Esta secção abrange os seguintes tópicos:
Mensagens de caracteres não pertencentes ao sistema
Um procedimento de janela pode receber as seguintes mensagens de caracteres: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHARe WM_UNICHAR. A função TranslateMessage gera uma mensagem WM_CHAR ou WM_DEADCHAR quando processa uma mensagem WM_KEYDOWN. Da mesma forma, gera uma mensagem WM_SYSCHAR ou WM_SYSDEADCHAR quando processa uma mensagem WM_SYSKEYDOWN.
Uma aplicação que processa a entrada do teclado normalmente ignora todas as mensagens, exceto as WM_CHAR e WM_UNICHAR, passando quaisquer 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 caracteres contém o código de caractere da tecla de caractere que foi pressionada. O valor do código do caractere depende da classe da janela que recebe a mensagem. Se a versão Unicode da funçãoRegisterClass foi usada para registrar a classe window, o sistema fornece caracteres Unicode para todas as janelas dessa classe. Caso contrário, o sistema fornece códigos de caracteres ANSI. Para obter mais informações, consulte Registrando 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 carácter é idêntico ao conteúdo do parâmetro lParam da mensagem de tecla pressionada que foi traduzida para produzir a mensagem de carácter. Para obter informações, consulte sinalizadores de mensagem de pressionamento de tecla.
Dead-Character Mensagens
Alguns teclados não ingleses contêm teclas de caracteres que não se espera que produzam caracteres por si só. 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 de 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 tecla circunflexa seguida da tecla "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 inativa. 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 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 gera duas mensagens WM_CHAR. O parâmetro wParam do primeiro contém o código de caracteres 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 tecla morta do sistema (uma tecla morta que é pressionada em combinação com a tecla Alt). Um aplicativo normalmente ignora a mensagem WM_SYSDEADCHAR.
Estado-chave
Ao processar uma mensagem de teclado, um aplicativo pode precisar determinar o status de outra tecla além daquela que gerou a mensagem atual. Por exemplo, um aplicativo de processamento de texto que permite ao usuário pressionar 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 o função GetKeyState para determinar o status de uma chave virtual no momento em que a mensagem atual foi gerada; ele pode usar o 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 sem caracteres, como Tab e Enter é armazenado como uma cadeia de caracteres. Um aplicativo pode recuperar o nome de qualquer tecla do layout do teclado chamando a funçãoGetKeyNameText.
Traduções de teclas e caracteres
O sistema inclui várias funções especiais que traduzem códigos de digitalização, códigos de caracteres e códigos de teclas virtuais fornecidos por várias mensagens de pressionamento de teclas. Essas funções incluem MapVirtualKey, ToAscii, ToUnicodee VkKeyScan.
Além disso, o Microsoft Rich Edit 3.0 suporta o IME HexToUnicode, que permite que um usuário converta entre caracteres hexadecimais e Unicode usando teclas de atalho. Isso significa que quando o Microsoft Rich Edit 3.0 é incorporado em um aplicativo, o aplicativo herdará os recursos do IME HexToUnicode.
Suporte para Teclas de Atalho
Uma tecla de atalho é uma combinação de teclas que gera uma mensagem WM_HOTKEY, uma mensagem que o sistema coloca no topo da fila de mensagens de uma thread, ignorando quaisquer mensagens existentes na fila. As aplicações usam teclas de atalho para obter entrada de alta prioridade por teclado do utilizador. Por exemplo, ao definir uma tecla de atalho que consiste na combinação de teclas Ctrl+C, uma aplicação pode permitir que o utilizador cancele uma operação demorada.
Para definir uma tecla de atalho, um aplicativo chama a função RegisterHotKey, especificando a combinação de teclas que gera a mensagem WM_HOTKEY, o identificador da janela para receber a mensagem e o identificador da tecla de atalho. 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 tecla de atalho. O aplicativo pode definir várias teclas de atalho para um thread, mas cada tecla de atalho no thread deve ter um identificador exclusivo. Antes que o aplicativo seja encerrado, ele deve usar a função UnregisterHotKey para destruir a tecla de atalho.
Os aplicativos podem usar um controle de tecla de atalho para tornar mais fácil para o usuário escolher uma tecla de atalho. Os controlos de teclas de atalho são normalmente usados para definir uma tecla de atalho que ativa uma janela; eles não utilizam as funções RegisterHotKey e UnregisterHotKey. Em vez disso, uma aplicação que utiliza um controlo de tecla de atalho normalmente envia a mensagem WM_SETHOTKEY para definir a tecla de atalho. Sempre que o usuário pressiona a tecla de atalho, o sistema envia uma mensagem WM_SYSCOMMAND especificando SC_HOTKEY. Para mais informações sobre os controlos de teclas de atalho, consulte "Usar os Controlos de Teclas de Atalho" em Controles de Teclas de Atalho.
Teclas do teclado para navegação e outras funções
O Windows fornece suporte para teclados com teclas especiais para funções do navegador, funções de mídia, inicialização de aplicativos e gerenciamento de energia. O WM_APPCOMMAND suporta as teclas extras do teclado. Além disso, a função ShellProc é modificada para suportar as teclas extras do teclado.
É improvável que uma janela filha em uma aplicação componente seja capaz de implementar comandos diretamente para essas teclas extras do teclado. Então, quando uma dessas teclas é pressionada, DefWindowProc enviará uma mensagem WM_APPCOMMAND para uma janela. DefWindowProc também propagará a mensagem WM_APPCOMMAND para a sua janela mãe. 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 no botão direito e borbulha para seu pai. Além disso, se DefWindowProc receber uma mensagem WM_APPCOMMAND para uma janela de nível superior, chamará um gancho de shell com o código HSHELL_APPCOMMAND.
O Windows também suporta o Microsoft IntelliMouse Explorer, que é um mouse com cinco botões. Os dois botões extras suportam a navegação para frente e para trás do navegador. Para obter mais informações, consulte XBUTTONs.
Simulando a 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, em bytes, da estrutura INPUT.
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 se misture com os eventos simulados. Quando a chamada é concluída, o valor de retorno indica o número de eventos de entrada reproduzidos com êxito. Se esse valor for zero, a entrada foi bloqueada.
A função SendInput não redefine o estado atual do teclado. Portanto, se o usuário tiver alguma tecla pressionada quando você chamar essa função, elas podem interferir com os eventos que essa função gera. 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
Uma língua é uma língua 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 inglesas faladas no Reino Unido e nos Estados Unidos. Os aplicativos usam valores, chamados identificadores de idioma, para identificar exclusivamente idiomas e subidiomas.
As aplicações usam localidades para definir o idioma no qual a entrada e a saída são normalmente processadas. A definição da localidade do teclado, por exemplo, afeta os valores de caracteres gerados pelo teclado. A definição da localidade do monitor ou da 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 de um monitor ou impressora selecionando uma fonte que ofereça suporte à localidade especificada.
Um layout de teclado não apenas especifica a posição física das teclas no teclado, mas também determina os valores de caracteres gerados pressionando essas teclas. Cada layout identifica o idioma de entrada atual e determina quais valores de caracteres são gerados por quais teclas e combinações de teclas.
Cada layout de teclado tem uma alça correspondente que identifica o layout e o idioma. A palavra baixa do identificador é um identificador de idioma. A palavra alta é um identificador de dispositivo, especificando o layout físico, ou é zero, indicando um layout físico 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 para 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 familiar em inglês.
Geralmente, não se espera que os aplicativos manipulem diretamente os idiomas de entrada. Em vez disso, o usuário configura combinações de idioma e layout e, em seguida, alterna entre elas. Quando o usuário clica em texto marcado com um idioma diferente, o aplicativo chama a funçãoActivateKeyboardLayout para ativar o layout padrão do usuário para esse idioma. Se o usuário edita texto em um idioma que não está na lista ativa, o aplicativo pode chamar a funçãoLoadKeyboardLayout com o idioma para obter um layout baseado nesse idioma.
A funçãoActivateKeyboardLayout 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 estendido zero. As alças de layout de teclado podem ser obtidas pela função LoadKeyboardLayout ou pela função GetKeyboardLayoutList. Os valores HKL_NEXT e HKL_PREV também podem ser usados para selecionar o teclado seguinte ou anterior.
A funçãoGetKeyboardLayoutName recupera o nome do layout de teclado ativo para o thread de chamada. Se um aplicativo cria o layout ativo usando a funçãoLoadKeyboardLayout, GetKeyboardLayoutName recupera 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 principal, portanto, não pode retornar informações específicas sobre o idioma de entrada. A funçãoGetKeyboardLayout, no entanto, pode ser usada para determinar o idioma de entrada.
A funçãoLoadKeyboardLayout 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 devem sempre usar o valor KLF_SUBSTITUTE_OK ao carregar layouts de teclado para garantir que a preferência do usuário, se houver, seja selecionada.
Para suporte multilíngue, a funçãoLoadKeyboardLayout 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. Este sinalizador deve ser usado em todas as chamadas, exceto na última.
A funçãoUnloadKeyboardLayout é restrita porque 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.