Compartilhar via


Buffer de entrada do console

Cada console tem um buffer de entrada que contém uma fila de registros de eventos de entrada. Quando a janela de um console tem o foco do teclado, um console formata cada evento de entrada (como um único pressionamento de tecla, um movimento do mouse ou um clique no botão do mouse) como um registro de entrada que ele coloca no buffer de entrada do console.

Os aplicativos podem acessar o buffer de entrada de um console indiretamente usando as funções de E/S de console de alto nível ou diretamente usando as funções de entrada de console de baixo nível. As funções de entrada de alto nível filtram e processam os dados no buffer de entrada, retornando apenas um fluxo de caracteres de entrada. As funções de entrada de baixo nível permitem que os aplicativos leiam registros de entrada diretamente do buffer de entrada de um console ou coloquem registros de entrada no buffer de entrada. Para abrir um identificador para o buffer de entrada de um console, especifique o valor CONIN$ em uma chamada para a função CreateFile .

Um registro de entrada é uma estrutura que contém informações sobre o tipo de evento que ocorreu (teclado, mouse, redimensionamento de janela, foco ou evento de menu), bem como detalhes específicos sobre o evento. O membro EventType em uma estrutura de INPUT_RECORD indica qual tipo de evento está contido no registro.

Os eventos de foco e menu são colocados no buffer de entrada de um console para uso interno pelo sistema e devem ser ignorados pelos aplicativos.

Eventos de teclado

Os eventos de teclado são gerados quando qualquer tecla é pressionada ou liberada; isso inclui chaves de controle. No entanto, a tecla ALT tem um significado especial para o sistema quando pressionada e liberada sem ser combinada com outro caractere e não é passada para o aplicativo. Além disso, a combinação de teclas CTRL+C não será passada se o identificador de entrada estiver no modo processado.

Se o evento de entrada for um pressionamento de teclas, o membro do evento no INPUT_RECORD será uma estrutura KEY_EVENT_RECORD que contém as seguintes informações:

  • Um valor booliano que indica se a tecla foi pressionada ou liberada.
  • Uma contagem de repetição que pode ser maior que uma quando uma chave é mantida pressionada.
  • O código de chave virtual, identificando a chave fornecida de maneira independente do dispositivo.
  • O código de verificação virtual, indicando o valor dependente do dispositivo gerado pelo hardware do teclado.
  • O caractere Unicode™ ou ANSI traduzido.
  • Uma variável de sinalizador que indica o estado das chaves de controle (as teclas ALT, CTRL, SHIFT, NUM LOCK, SCROLL LOCK e CAPS LOCK) e indica se uma tecla aprimorada foi pressionada. As teclas aprimoradas para teclados ibm® 101 teclas e 102 teclas são as teclas INS, DEL, HOME, END, PAGE UP, PAGE DOWN e seta nos clusters à esquerda do teclado numérico e as teclas divide (/) e ENTER no teclado numérico.

Eventos do mouse

Os eventos do mouse são gerados sempre que o usuário move o mouse ou pressiona ou libera um dos botões do mouse. Os eventos do mouse serão colocados no buffer de entrada somente se as seguintes condições forem atendidas:

  • O modo de entrada do console é definido como ENABLE_MOUSE_INPUT (o modo padrão).
  • A janela do console tem o foco do teclado.
  • O ponteiro do mouse está dentro das bordas da janela do console.

Se o evento de entrada for um evento de mouse, o membro do Evento no INPUT_RECORD será uma estrutura MOUSE_EVENT_RECORD que contém as seguintes informações:

  • As coordenadas do ponteiro do mouse em termos de linha de célula de caractere e coluna no sistema de coordenadas do buffer de tela do console.
  • Uma variável de sinalizador que indica o estado dos botões do mouse.
  • Uma variável de sinalizador que indica o estado das chaves de controle (ALT, CTRL, SHIFT, NUM LOCK, SCROLL LOCK e CAPS LOCK) e indica se uma tecla aprimorada foi pressionada. As teclas aprimoradas para teclados ibm 101 teclas e 102 teclas são as teclas INS, DEL, HOME, END, PAGE UP, PAGE DOWN e seta nos clusters à esquerda do teclado numérico e as teclas divide (/) e ENTER no teclado numérico.
  • Uma variável de sinalizador que indica se o evento foi um evento normal de pressionamento de botão ou de liberação de botão, um evento de movimento do mouse ou o segundo clique de um evento de clique duplo.

Observação

As coordenadas de posição do mouse estão em termos do buffer de tela do console, não da janela do console. O buffer de tela pode ter sido rolado em relação à janela, portanto, o canto superior esquerdo da janela não é necessariamente a coordenada (0,0) do buffer de tela do console. Para determinar as coordenadas do mouse relativas ao sistema de coordenadas da janela, subtraia as coordenadas de origem da janela das coordenadas de posição do mouse. Use a função GetConsoleScreenBufferInfo para determinar as coordenadas de origem da janela.

O membro dwButtonState da estrutura MOUSE_EVENT_RECORD tem um bit correspondente a cada botão do mouse. O bit será 1 se o botão estiver inoperante e 0 se o botão estiver ativado. Um evento de liberação de botão é detectado por um valor 0 para o membro dwEventFlags de MOUSE_EVENT_RECORD e uma alteração no bit de um botão de 1 para 0. A função GetNumberOfConsoleMouseButtons recupera o número de botões no mouse.

Eventos de Buffer-Resizing

O menu de uma janela do console permite que o usuário altere o tamanho do buffer de tela ativo; essa alteração gera um evento de redimensionamento de buffer. Os eventos de redimensionamento de buffer serão colocados no buffer de entrada se o modo de entrada do console estiver definido como ENABLE_WINDOW_INPUT (ou seja, o modo padrão será desabilitado).

Se o evento de entrada for um evento de redimensionamento de buffer, o membro event do INPUT_RECORD será uma estrutura WINDOW_BUFFER_SIZE_RECORD que contém o novo tamanho do buffer de tela do console, expresso em linhas e colunas de célula de caractere.

Se o usuário reduzir o tamanho do buffer de tela do console, todos os dados na parte descartada do buffer serão perdidos.

As alterações no tamanho do buffer da tela do console como resultado de chamadas de aplicativo para a função SetConsoleScreenBufferSize não são geradas como eventos de redimensionamento de buffer.