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 do console tem o foco do teclado, o console formata cada evento de entrada (como pressionamento de tecla único, um movimento do mouse ou um clique no botão do mouse) como um registro de entrada que é colocado no buffer de entrada do console.

Os aplicativos podem acessar indiretamente o buffer de entrada de um console por meio das funções de E/S de console de alto nível ou diretamente com 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 e retornam somente 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 que coloquem registros de entrada no buffer de entrada. Para abrir o identificador do buffer de tela ativo do 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 ocorrido (teclado, mouse, redimensionamento de janela, foco ou evento de menu), assim como detalhes específicos sobre o evento. O membro EventType em uma estrutura INPUT_RECORD indica que 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 do teclado são gerados quando uma tecla é pressionada ou liberada; isso inclui as teclas de controle. No entanto, a tecla ALT tem um significado especial para o sistema quando pressionada e liberada sem combinação com outro caractere e não é passada para o aplicativo. Além disso, a combinação de teclas CTRL+C não é passada se o identificador de entrada está no modo processado.

Quando o evento de entrada é um pressionamento de tecla, o membro do Evento em INPUT_RECORD é 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 do que uma quando uma tecla é mantida pressionada.
  • O código de tecla virtual que identifica a tecla fornecida de maneira independente do dispositivo.
  • O código de varredura 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 teclas de controle (as teclas ALT, CTRL, SHIFT, NUM LOCK, SCROLL LOCK e CAPS LOCK) e se uma tecla aprimorada foi pressionada. As teclas aprimoradas para os teclados IBM® de 101 e 102 teclas são as teclas INS, DEL, HOME, END, PAGE UP, PAGE DOWN e teclas de direção nos clusters à esquerda do teclado; e as teclas divide (/) e ENTER no teclado numérico.

Eventos de 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 de mouse são colocados no buffer de entrada somente quando as seguintes condições são 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.

Quando o evento de entrada é um evento de mouse, o membro do Evento em INPUT_RECORD é uma estrutura KEY_EVENT_RECORD que contém as seguintes informações:

  • As coordenadas da linha e coluna de caractere-célula do ponteiro do mouse no sistema de coordenadas do buffer da 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 teclas de controle (ALT, CTRL, SHIFT, NUM LOCK, SCROLL LOCK e CAPS LOCK) e se uma tecla aprimorada foi pressionada. As teclas aprimoradas para os teclados IBM de 101 e 102 teclas são as teclas INS, DEL, HOME, END, PAGE UP, PAGE DOWN e teclas de direção nos clusters à esquerda do teclado; 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 ou 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 são relativas ao buffer da 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 em relação 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 ativo. 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 redimensionamento de buffer

O menu de 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 são colocados no buffer de entrada quando o modo de entrada do console está definido como ENABLE_WINDOW_INPUT (ou seja, quando o modo padrão está desabilitado).

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

Se o usuário reduzir o tamanho do buffer da 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 resultantes de chamadas de aplicativo para a função SetConsoleScreenBufferSize não são geradas como eventos de redimensionamento de buffer.