How can I find the state of NumLock, CapsLock and ScrollLock in .NET?

后端 未结 4 1283
忘掉有多难
忘掉有多难 2020-11-27 18:41

How can I find the state of NumLock, CapsLock and ScrollLock keys in .NET?

相关标签:
4条回答
  • 2020-11-27 18:53

    Check State

    To check state of CapsLock, NumLock and ScrollLock keys you can use Control.IsKeyLocked method:

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

    Actively Show The State in UI in status bar

    Since the lock keys can be turn on or turn off when your application doesn't have focus handling keyboard events of the form is not enough to detect changes on the key lock state and you should also put your logic in some other places like activation event of your form or you need to register a global keyboard hook.

    As a simple and reliable solution you can check their status in Application.Idle event. You must detach your idle event handler when your form closed.

    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);
    }
    
    0 讨论(0)
  • 2020-11-27 18:59

    With Framework 2.0 and above you can use an framework function

    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);
        }
    
    0 讨论(0)
  • 2020-11-27 19:01

    If anyone comes across this thread while developing in WPF, you can use the Keyboard.IsToggled method that was introduced in .NET 3.0:

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

    You'll have to add the following using directive to the top of your class, if it's not already there:

    using System.Windows.Input;
    

    Internally, the IsToggled() method checks to see whether or not the KeyStates.Toggled flag is set for the specified key.

    [Flags]
    public enum KeyStates : byte
    {
        None = (byte) 0,
        Down = (byte) 1,
        Toggled = (byte) 2,
    }
    
    0 讨论(0)
  • 2020-11-27 19:04

    Import the WinAPI function GetKeyState

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

    and then you can use it like that

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

    EDIT: the above is for framework 1.1, for framework 2.0 + you can use

    Control.IsKeyLocked

    0 讨论(0)
提交回复
热议问题