duda statusBar

22/07/2005 - 17:32 por kalrros | Informe spam
me gustaria saber como puedo hacer para que en la statusBar me aparezca si tengo activadas las teclas Insert, Caps Lock, Num Lock, y una vez que aparezcan al hacer clik sobre ellas que se desactiven o activen

Un saludo y gracias

kalrros

Ver este tema: http://www.softwaremix.net/viewtopic-415163.htm

Enviado desde http://www.softwaremix.net
 

Leer las respuestas

#1 Angel J. Hernández M.
24/07/2005 - 03:49 | Informe spam
Hola, lo que deseas hacer lo puedes conseguir mediante Interop (con el API).
Para ello debes sobreescribir (override) el procedimiento de ventana (Window
Procedure) del formulario en el cual estás interesado. El evento que te
interesa es WM_KEYDOWN (cuyo valor es 256 en decimal). Para saber el estado
de las "luces" del teclado debes llamar a la función GetKeyState del API. A
continuación te muestro como sería


Los valores de los mensajes que deseas utilizar los muestro a continuación

CapsLock
********
Mensaje: msg=0x100 (WM_KEYDOWN) hwnd=0xe0386 wparam=0x14 lparam=0x3a0001
result=0x0 (20 en decimal)

NumLock
*******
Mensaje: msg=0x100 (WM_KEYDOWN) hwnd=0xe0386 wparam=0x90 lparam=0x1450001
result=0x0 (144 en decimal)

Insert
******
Mensaje: msg=0x100 (WM_KEYDOWN) hwnd=0xe0386 wparam=0x2d lparam=0x1520001
result=0x0 (45 en decimal)



// Debes utilizar este namespace
using System.Runtime.InteropServices;


// Sobreescribimos el procedimiento de ventana del formulario

protected override void WndProc(ref Message m) {
base.WndProc (ref m);

if (m.ToString().ToUpper().IndexOf("WM_KEYDOWN") > -1) {
short estado = 0;

if(m.WParam.ToInt32().Equals(20) || m.WParam.ToInt32().Equals(144) ||
m.WParam.ToInt32().Equals(45))
estado = LlamadasAPI.GetKeyState(m.WParam.ToInt32());

if(m.WParam.ToInt32().Equals(20))
statusBar1.Panels[1].Text = "CapsLock: "+(estado == -127 ? "ON" : "OFF");
else if (m.WParam.ToInt32().Equals(144))
statusBar1.Panels[2].Text = "NumLock: "+(estado == -127 ? "ON" : "OFF");
else if (m.WParam.ToInt32().Equals(45))
statusBar1.Panels[0].Text = "Insert: "+(estado == -127 ? "ON" : "OFF");
}
}


// Clase que encapsula las llamadas al API
internal class LlamadasAPI {
[DllImport("user32.dll")]
public static extern short GetKeyState(int nVirtKey);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr
wParam, IntPtr lParam);
}


Puedes utilizar la función SendMessage del API si quieres enviar algún
mensaje al procedimiento de ventana o si quieres enviar una pulsación de
tecla al mismo también puedes usar la función SendInput.

Espero que sea de utilidad,

Saludos,


Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda
http://www.consein.com


"kalrros" escribió en el mensaje
news:

me gustaria saber como puedo hacer para que en la statusBar me aparezca si
tengo activadas las teclas Insert, Caps Lock, Num Lock, y una vez que
aparezcan al hacer clik sobre ellas que se desactiven o activen.

Un saludo y gracias.


kalrros


Ver este tema: http://www.softwaremix.net/viewtopic-415163.html

Enviado desde http://www.softwaremix.net


Preguntas similares