Como posso encontrar o estado do NumLock, CapsLock e ScrollLock em .net?
Pergunta
Como posso encontrar o estado de chaves NumLock, CapsLock e ScrollLock em .net?
Solução
Import a função WinAPI GetKeyState
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode);
e então você pode usá-lo como aquele
bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
EDIT: o acima é para Framework 1.1, para Framework 2.0 + você pode usar
Outras dicas
Com Framework 2.0 e acima, você pode usar uma função de quadro
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);
}
Se alguém vem toda esta discussão durante o desenvolvimento no WPF, você pode usar o Keyboard.IsToggled método que foi introduzido em .NET 3.0:
var isNumLockToggled = Keyboard.IsKeyToggled(Key.NumLock);
var isCapsLockToggled = Keyboard.IsKeyToggled(Key.CapsLock);
var isScrollLockToggled = Keyboard.IsKeyToggled(Key.Scroll);
Você terá que adicionar a seguinte diretiva using
para o topo da sua classe, se ele não estiver lá:
using System.Windows.Input;
Internamente, o IsToggled () método verifica para ver se ou não a KeyStates.Toggled
sinalizador é definido para a chave especificada.
[Flags]
public enum KeyStates : byte
{
None = (byte) 0,
Down = (byte) 1,
Toggled = (byte) 2,
}
Verificar Estado
Para verificar estado de CapsLock , NumLock e ScrollLock chaves que você pode usar
Control.IsKeyLocked
método:
var capsLockIsOn = Control.IsKeyLocked(Keys.CapsLock);
ativamente mostrar o estado
Uma vez que as teclas de bloqueio pode ser ligar ou desligar quando o aplicativo não tem manipulação foco eventos de teclado do formulário não é suficiente para detectar alterações no estado de bloqueio chave e você também deve colocar a sua lógica em alguns outros lugares como evento de ativação do seu formulário ou você precisa registrar um gancho do teclado global.
Como uma solução simples e confiável você pode verificar o seu estado Application.Idle
evento. Você deve separar seu manipulador de eventos ocioso quando a sua forma fechada.
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);
}