Partilhar 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 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 do sistema e devem ser ignorados pelos aplicativos.

Eventos de teclado

Os eventos do teclado são gerados quando qualquer tecla é pressionada ou liberada; Isso inclui teclas 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 é passada se o identificador de entrada estiver no modo processado.

Se o evento de entrada for um pressionamento de tecla, o membro do evento em INPUT_RECORD será uma estrutura KEY_EVENT_RECORD contendo as seguintes informações:

  • Um valor booleano que indica se a tecla foi pressionada ou liberada.
  • Uma contagem de repetições que pode ser maior do que uma quando uma tecla é pressionada.
  • O código de chave virtual, identificando a chave dada de forma 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 teclas 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 os teclados IBM® de 101 e 102 teclas são as teclas INS, DEL, HOME, END, PAGE UP, PAGE DOWN e setas 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 sã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 doevento em INPUT_RECORD será uma estrutura de MOUSE_EVENT_RECORD contendo as seguintes informações:

  • As coordenadas do ponteiro do mouse em termos de linha e coluna de célula de caractere 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 teclas de controle (ALT, CTRL, SHIFT, NUM LOCK, SCROLL LOCK e CAPS LOCK) e indica 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 setas 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 pressionar botão 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 em termos do 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 é 1 se o botão estiver para baixo e 0 se o botão estiver para cima. Um evento de liberação de botão é detetado 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.

Buffer-Resizing Eventos

O menu de uma janela de 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 se o modo de entrada do console estiver definido como ENABLE_WINDOW_INPUT (ou seja, o modo padrão estiver desabilitado).

Se o evento de entrada for um evento de redimensionamento de buffer, o membro de evento de INPUT_RECORD será uma estrutura de 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 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.