Detectar pulsación de tecla en Windows usando C++
- Tipos de aplicaciones de Windows usando C++
- Entrada de teclado en aplicaciones de 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++:
-
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.
-
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:
- Entrada de caracteres: texto ingresado en un documento o cuadro de edición por el usuario.
- 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.
- 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:
- Dígitos 0-9: los códigos varían de 0x30 a 0x39
- 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.
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