miércoles, 6 de junio de 2007

Controlando el teclado extenido en C# .Net

Para los desarrolladores, que en algún momento se van a encontrar con algunas de las siguientes piedras en el camino:

¿Cómo le hago para presionar con código la tecla CAPS LOCK (MAYUS), NUM LOCK, etc.?

¿Cómo le hago para saber si las teclas CAPS LOCK (MAYUS), NUM LOCK, etc. están presionadas?

Pues aquí está la solución para estos cuestionamientos!......

1) Adicionemos un formulario a nuestro proyecto
en el código fuente utilizamos las siguiente librería:

using System.Runtime.InteropServices;


2) Importamos las dos API que siguen:
La primera GetKeyState nos sirve para saber cual es la tecla que se ha presionado
La segunda keybd_event nos sirve para presionar una tecla

public partial class frmTeclas : Form
{
[DllImport("user32.dll")]
public static extern int GetKeyState(byte nVirtKey);
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
.
.
.

}


3) Definimos las teclas que deseamos controlar (Ver nota al final del documento):

byte NUMLOCK_KEY = 0X90;
byte CAPS_KEY = 0x14;
Nota: Estas definiciones se colocan debajo de las importaciones de las dll

4) Creamos dos funciones útiles para controlar el teclado

//Retornar el estado de una tecla
private bool KeyStatus(byte KeyCode)
{
return (GetKeyState(KeyCode) == 1);
}

//Enviar una senal de presion para (teclado extendido)
private void PresionarTecla(byte KeyCode)
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
keybd_event(KeyCode, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
keybd_event(KeyCode, 0x45, KEYEVENTF_EXTENDEDKEY KEYEVENTF_KEYUP,
ntPtr)0);
}




5) Aquí es probando, inserta un botón en fu formulario y dale doble clic y colócale el código como sigue:

private void button1_Click(object sender, EventArgs e)
{
if (KeyStatus(CAPS_KEY) == true)
MessageBox.Show("CAPS: Estado Activo");
else
MessageBox.Show("CAPS: Estado Inactivo");

PresionarTecla(NUMLOCK_KEY);
}



Nota:
Una referencia completa del teclado ASCII
http://es.wikipedia.org/wiki/ASCII

Articulo por: Eider Mauricio Aristizábal Erazo.

2 comentarios:

Roger Rodríguez dijo...

Funciona perfecto, solamente en la publicación, si podrías cambiar en la seccion 4 al final :

sustituir:
keybd_event(KeyCode, 0x45, KEYEVENTF_EXTENDEDKEY KEYEVENTF_KEYUP,
ntPtr)0);

por:

keybd_event(KeyCode, 0x45, KEYEVENTF_KEYUP, (UIntPtr)0);

y para apreciar mejor en el 5:

Sustituir:
PresionarTecla(NUMLOCK_KEY);

por:
PresionarTecla(CAPS_KEY);

Gracias por tu aporte,

saludos,

Roger Rodríguez

JP dijo...

SOS GRANDE COL 5 - ARG 0