Detectar pulsación de tecla en Windows usando C++

Muhammad Husnain 16 febrero 2024
  1. Tipos de aplicaciones de Windows usando C++
  2. Entrada de teclado en aplicaciones de Windows usando C++
  3. Detectar pulsación de tecla en Windows usando C++
Detectar pulsación de tecla en Windows usando C++

Esta breve guía discutirá cómo podemos manejar la pulsación de teclas en aplicaciones de Windows usando C++. Antes de continuar, veremos una breve introducción a las aplicaciones de Windows que usan C++.

Tipos de aplicaciones de Windows usando C++

Hay dos tipos de aplicaciones que se pueden desarrollar en C++:

  1. Aplicaciones basadas en consola

    Las aplicaciones de consola son aquellas aplicaciones que se ejecutan solo desde la línea de comandos y solo pueden mostrar texto. Por lo tanto, también se denominan aplicaciones de línea de comandos.

  2. Aplicaciones basadas en ventanas

    Mientras que las aplicaciones basadas en Windows son aquellas aplicaciones que se desarrollan utilizando la API C nativa original de Windows y se muestran como una aplicación en ventana, a diferencia de una aplicación basada en consola. Estas aplicaciones se utilizan para crear software en formato de ventana y pueden mostrar texto, imágenes y todo lo que contienen.

    Hay muchas formas de desarrollar aplicaciones de Windows: podemos usar la API de Win32 directamente y crear un bucle de estilo C para escuchar los eventos de Windows. Del mismo modo, también puede crear aplicaciones de Windows con Microsoft Foundation Classes (MFC), un estilo orientado a objetos y envuelve la API de Win32.

    Un desarrollador debe ocuparse específicamente de los mensajes de Windows dentro de una función de procedimiento de Windows al crear un programa Win32 que se ejecuta en una ventana. Una aplicación Win32 se puede compilar como un binario de 32 bits (x86) o de 64 bits (x64).

También debemos preocuparnos por los eventos del teclado al crear una aplicación de Windows.

Entrada de teclado en aplicaciones de Windows usando C++

El teclado se utiliza para una variedad de propósitos, que incluyen:

  1. Entrada de caracteres: texto ingresado en un documento o cuadro de edición por el usuario.
  2. Métodos abreviados de teclado: usar CTRL+O para abrir un archivo es un ejemplo de una pulsación de tecla que invoca las funciones de la aplicación.
  3. Comandos del sistema operativo: usar ALT+TAB para cambiar de ventana es un ejemplo de una pulsación de tecla que invoca las funciones del sistema.

Al atender la entrada del teclado, uno debe cuidar todos los casos de una pulsación de tecla. Por ejemplo, si se presiona la tecla B, pueden darse los siguientes escenarios:

  • B
  • b

Además, si se presiona la tecla Ctrl, al presionar la tecla B se obtendrá el atajo de teclado Ctrl+B, que es el atajo Comando para poner texto en negrita.

Códigos clave

El sistema operativo genera un código de escaneo para una tecla cuando se presiona. Estos códigos de escaneo varían de un teclado a otro.

Estos códigos son únicos para todas las teclas del teclado; por ejemplo, tecla izquierda y tecla derecha tienen códigos de escaneo diferentes. Dado que estos códigos son alfanuméricos y difíciles de memorizar, el controlador del dispositivo de teclado traduce estos códigos de escaneo a códigos de teclas virtuales, que son independientes del dispositivo.

El archivo de biblioteca WinUser.h define las constantes para todos los códigos de teclas virtuales excepto los caracteres A-Z y los dígitos 0-9. Sus códigos virtuales se asignan a sus equivalentes ASCII:

  1. Dígitos 0-9: los códigos varían de 0x30 a 0x39
  2. Alfabetos A-Z: los códigos van desde 0x41 a 0x5A

Para todas las demás claves, hay constantes definidas que se asignan para escanear códigos de esas claves; por ejemplo, para la tecla de flecha izquierda, el código virtual es VK_LEFT. Como se discutió anteriormente, no se definen códigos virtuales para los caracteres con los valores ASCII correspondientes.

Por ejemplo, no existe un código virtual para el carácter B como VK_B. La lista que muestra algunos de los códigos virtuales de uso común se muestra a continuación:

código virtual Escanear código Descripción
VK_LBUTTON 0x01 Boton izquierdo del raton
VK_RBUTTON 0x02 Botón derecho del mouse
VK_CANCEL 0x03 Procesamiento de ruptura de control
VK_MBUTTON 0x04 Botón central del ratón (ratón de tres botones)
VK_XBUTTON1 0x05 Botón de ratón X1
VK_XBUTTON2 0x06 Botón de ratón X2
VK_BACK 0x08 tecla RETROCESO
VK_TAB 0x09 Tecla de tabulación
VK_SHIFT 0x10 Tecla Shift
VK_CONTROL 0x11 tecla CTRL
VK_MENU 0x12 Tecla Alt
VK_PAUSE 0x13 tecla PAUSA
VK_CAPITAL 0x14 Tecla BLOQ MAYÚS
VK_NUMPAD0 a VK_NUMPAD9 0x60 - 0x69 Teclado numérico 0-9 tecla
VK_F1 a VK_F12 0x70 - 0x7B Tecla de función F1 a F12
VK_NUMLOCK 0x90 tecla BLOQ NUM
VK_SCROLL 0x91 Tecla BLOQUEO DE DESPLAZAMIENTO
VK_LSHIFT 0xA0 Tecla MAYÚS izquierda
VK_RSHIFT 0xA1 Tecla MAYÚS derecha
VK_LCONTROL 0xA2 Tecla CONTROL izquierda
VK_RCONTROL 0xA3 Tecla CONTROL derecha
VK_LMENU 0xA4 Tecla MENÚ izquierda
VK_RMENU 0xA5 Tecla MENÚ derecha

Hay muchos otros códigos que puedes encontrar en este enlace.

Detectar pulsación de tecla en Windows usando C++

Cada vez que se presiona una tecla en un teclado, se genera un evento. Se genera un mensaje cada vez que se presiona una tecla, y esos mensajes están controlados por eventos.

Podemos obtener el estado de la tecla pulsada mediante la función GetKeyState(). Esta función toma un código de tecla virtual como argumento y devuelve un indicador que indica si esa tecla está presionada o no.

El método GetKeyState() es interesante ya que devuelve el estado del teclado virtual. Este estado virtual cambia a medida que los mensajes se eliminan de la cola y se basan en el contenido de la cola de mensajes.

GetKeyState proporciona una instantánea del teclado cuando cada mensaje se puso en cola cuando su programa procesa los mensajes de la ventana. GetKeyState informa el estado del teclado cuando el usuario presiona el botón del mouse; por ejemplo, si el último mensaje en la cola fue WM _BUTTONDOWN.

Sintaxis:

if (GetKeyState(VK_SHIFT) & 0x8000) {
  // Shift down
}

El indicador de bit 0x8000 determina si la tecla está presionada actualmente.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn