web-dev-qa-db-fra.com

Comment trouver l'état de Numlock, CapsLock et Scrolllock dans .NET?

Comment trouver l'état de Numlock, CapSlock et Touches ScrollLock dans .NET?

33
RV.

Importer la fonction Winapi Getkeystate

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

et puis vous pouvez l'utiliser comme ça

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

Edit: Ce qui précède est pour le cadre 1.1, pour le cadre 2.0 +, vous pouvez utiliser

Control.IsKeyLocked

48
Pablo Retyk

Avec cadre 2.0 et plus, vous pouvez utiliser une fonction-cadre

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);
    }
37
Summer-Time

Si quelqu'un entre sur ce fil tout en développant dans WPF, vous pouvez utiliser la méthode keyboard.istogled méthode introduite dans .NET 3.0:

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

Vous devrez ajouter la directive suivante using directive au sommet de votre classe, si ce n'est pas déjà là:

using System.Windows.Input;

Interne, la méthode istoggle () vérifie la méthode pour voir si le KeyStates.Toggled Le drapeau est défini pour la clé spécifiée.

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

Vérifier l'état

Pour vérifier l'état de CapsLockNumLock et ScrollLock clés que vous pouvez utiliser Control.IsKeyLocked Méthode:

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

montrer activement l'état

Étant donné que les touches de verrouillage peuvent être allumées ou désactivées lorsque votre application ne manipule pas la tâche des événements de clavier du formulaire ne suffit pas pour détecter les modifications de l'état de verrouillage de la clé et vous devez également mettre votre logique dans d'autres endroits tels que l'événement d'activation. de votre forme ou vous devez enregistrer un crochet de clavier global.

En tant que solution simple et fiable, vous pouvez vérifier leur statut dans Application.Idle événement. Vous devez détacher votre gestionnaire d'événements de veille lorsque votre formulaire fermé.

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);
}
7
Reza Aghaei