¿Cómo puedo encontrar el estado de NumLock, CapsLock y ScrollLock en .net?

¿Cómo puedo encontrar el estado de las teclas NumLock, CapsLock y ScrollLock en .net?

Importe la función WinAPI GetKeyState

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] public static extern short GetKeyState(int keyCode); 

y luego puedes usarlo así

 bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0; bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0; bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0; 

EDITAR: lo anterior es para el marco 1.1, para el marco 2.0 + puede usar

Control.IsKeyLocked

Con Framework 2.0 y superior puede usar una función de marco

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.iskeylocked%28v=vs.80%29.aspx

  public static bool NumlockActive() { return Control.IsKeyLocked(Keys.NumLock); } 

Si alguien encuentra este hilo mientras desarrolla en WPF, puede usar el método Keyboard.IsToggled que se introdujo en .NET 3.0:

 var isNumLockToggled = Keyboard.IsKeyToggled(Key.NumLock); var isCapsLockToggled = Keyboard.IsKeyToggled(Key.CapsLock); var isScrollLockToggled = Keyboard.IsKeyToggled(Key.Scroll); 

Deberá agregar la siguiente directiva using a la parte superior de su clase, si aún no está allí:

 using System.Windows.Input; 

Internamente, el método IsToggled () comprueba si el indicador KeyStates.Toggled está o no configurado para la clave especificada.

 [Flags] public enum KeyStates : byte { None = (byte) 0, Down = (byte) 1, Toggled = (byte) 2, } 

Verificar estado

Para verificar el estado de las teclas CapsLock , NumLock y ScrollLock , puede usar el método Control.IsKeyLocked :

 var capsLockIsOn = Control.IsKeyLocked(Keys.CapsLock); 

Mostrar activamente el estado

Dado que las teclas de locking se pueden activar o desactivar cuando su aplicación no tiene control de enfoque, los eventos de teclado del formulario no son suficientes para detectar cambios en el estado de locking de tecla y también debe poner su lógica en otros lugares como el evento de activación de su formulario o necesita registrar un gancho de teclado global.

Como una solución simple y confiable, puede verificar su estado en el evento Application.Idle . Debe separar el controlador de eventos inactivo cuando cierre su formulario.

 public Form1() { InitializeComponent(); Application.Idle += Application_Idle; } void Application_Idle(object sender, EventArgs e) { if (Control.IsKeyLocked(Keys.CapsLock)) toolStripStatusLabel1.Text = "CapsLock is On"; else toolStripStatusLabel1.Text = ""; } protected override void OnFormClosed(FormClosedEventArgs e) { Application.Idle -= Application_Idle; base.OnFormClosed(e); }