Pergunta

Como posso encontrar o estado de chaves NumLock, CapsLock e ScrollLock em .net?

Foi útil?

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

Control.IsKeyLocked

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top