Búfer de entrada de la consola

Cada consola tiene un búfer de entrada que contiene una cola de registros de eventos de entrada. Cuando la ventana de una consola tiene el foco del teclado, una consola da formato a cada evento de entrada (como una sola pulsación de tecla, un movimiento del mouse o un clic de botón del mouse) como un registro de entrada que coloca en el búfer de entrada de la consola.

Las aplicaciones pueden acceder indirectamente al búfer de entrada de una consola mediante las funciones de E/S de consola de alto nivel o directamente mediante las funciones de entrada de consola de bajo nivel. Las funciones de entrada de alto nivel filtran y procesan los datos en el búfer de entrada, devolviendo solo un flujo de caracteres de entrada. Las funciones de entrada de bajo nivel permiten a las aplicaciones leer registros de entrada directamente desde el búfer de entrada de una consola o colocar registros de entrada en el búfer de entrada. Para abrir un identificador en el búfer de entrada de una consola, especifique el valor CONIN$ en una llamada a la función CreateFile.

Un registro de entrada es una estructura que contiene información sobre el tipo de evento que se produjo (teclado, ratón, cambio de tamaño de ventana, foco o evento de menú), así como detalles específicos sobre el evento. El miembro EventType de una estructura INPUT_RECORD indica qué tipo de evento se encuentra en el registro.

Los eventos de foco y menú se colocan en el búfer de entrada de una consola para su uso interno por parte del sistema y las aplicaciones deben omitirlos.

Eventos de teclado

Los eventos de teclado se generan cuando se presiona o suelta cualquier tecla; esto incluye teclas de control. Sin embargo, la tecla ALT tiene un significado especial para el sistema cuando se presiona y suelta sin combinarse con otro carácter y no se pasa a la aplicación. Además, la combinación de teclas CTRL+C no se pasa si el identificador de entrada está en modo procesado.

Si el evento de entrada es una pulsación de tecla, el miembro Event de INPUT_RECORD es una estructura KEY_EVENT_RECORD que contiene la siguiente información:

  • Valor booleano que indica si la tecla se ha presionado o soltado.
  • Recuento de repeticiones que puede ser mayor que uno cuando se mantiene presionada una clave.
  • Código de tecla virtual que identifica la tecla específica independientemente del dispositivo.
  • Código de examen virtual que indica el valor dependiente del dispositivo generado por el hardware del teclado.
  • Carácter Unicode™ o ANSI traducido.
  • Variable de marca que indica el estado de las teclas de control (las teclas ALT, CTRL, MAYÚS, NUM LOCK, SCROLL LOCK y CAPS LOCK) e indica si se ha presionado una tecla mejorada. Las teclas mejoradas de los teclados IBM® de 101 y 102 teclas son INS, Supr, Inicio, Fin, Página anterior, Página siguiente y las teclas de dirección de los clústeres de la izquierda del teclado numérico, así como las teclas dividir (/) y ENTRAR del teclado numérico.

Eventos del mouse

Los eventos del ratón se generan cada vez que el usuario lo mueve o presiona o suelta uno de sus botones. Los eventos del ratón se colocan en el búfer de entrada solo si se cumplen las condiciones siguientes:

  • El modo de entrada de la consola se establece en ENABLE_MOUSE_INPUT (el modo predeterminado).
  • La ventana de la consola tiene el foco del teclado.
  • El puntero del mouse está dentro de los bordes de la ventana de la consola.

Si el evento de entrada es un evento de ratón, el miembro Event de INPUT_RECORD es una estructura MOUSE_EVENT_RECORD que contiene la siguiente información:

  • Coordenadas del puntero del mouse en términos de la fila y la columna de la celda de caracteres en el sistema de coordenadas del búfer de pantalla de la consola.
  • Variable de marca que indica el estado de los botones del ratón.
  • Variable de marca que indica el estado de las teclas de control (ALT, CTRL, MAYÚS, NUM LOCK, SCROLL LOCK y BLOQ MAYÚS) e indica si se ha presionado una tecla mejorada. Las teclas mejoradas de los teclados IBM de 101 y 102 teclas son INS, Supr, Inicio, Fin, Página anterior, Página siguiente y las teclas de dirección de los clústeres de la izquierda del teclado numérico, así como las teclas dividir (/) y ENTRAR del teclado numérico.
  • Variable de marca que indica si el evento era un evento normal de pulsación de botones o de liberación de botones, un evento de movimiento del ratón o el segundo clic de un evento de doble clic.

Nota:

Las coordenadas de posición del ratón se encuentran en términos del búfer de pantalla de la consola, no en la ventana de la consola. Es posible que el búfer de pantalla se haya desplazado con respecto a la ventana, por lo que la esquina superior izquierda de la ventana no es necesariamente la coordenada (0,0) del búfer de pantalla de la consola. Para determinar las coordenadas del ratón relativas al sistema de coordenadas de la ventana, reste las coordenadas de origen de la ventana a las coordenadas de posición del ratón. Use la función GetConsoleScreenBufferInfo para determinar las coordenadas de origen de la ventana.

El miembro dwButtonState de la estructura MOUSE_EVENT_RECORD tiene un bit correspondiente a cada botón de ratón. El bit es 1 si el botón está hacia abajo y 0 si el botón está hacia arriba. Un evento de liberación de botón se detecta mediante un valor 0 para el miembro dwEventFlags de MOUSE_EVENT_RECORD y un cambio en el bit de un botón de 1 a 0. La función GetNumberOfConsoleMouseButtons recupera el número de botones del ratón.

Eventos de cambio de tamaño de búfer

El menú de una ventana de consola permite al usuario cambiar el tamaño del búfer de pantalla activo; este cambio genera un evento de cambio de tamaño del búfer. Los eventos de cambio de tamaño del búfer se colocan en el búfer de entrada si el modo de entrada de la consola está establecido en ENABLE_WINDOW_INPUT (es decir, el modo predeterminado está deshabilitado).

Si el evento de entrada es un evento de cambio de tamaño del búfer, el miembro Event de INPUT_RECORD es una estructura WINDOW_BUFFER_SIZE_RECORD que contiene el nuevo tamaño del búfer de pantalla de la consola, expresado en columnas y filas de celda de caracteres.

Si el usuario reduce el tamaño del búfer de pantalla de la consola, se pierden los datos de la parte descartada del búfer.

Los cambios en el tamaño del búfer de pantalla de la consola como resultado de las llamadas de aplicación a la función SetConsoleScreenBufferSize no se generan como eventos de cambio de tamaño del búfer.