如何在.net中找到NumLock,CapsLock和ScrollLock的状态?

时间:2009-02-23 11:58:39

标签: c# .net capslock

如何在.net中找到NumLock,CapsLock和ScrollLock键的状态?

4 个答案:

答案 0 :(得分:47)

导入WinAPI函数GetKeyState

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

然后你可以像那样使用它

bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
编辑:上面是框架1.1,对于框架2.0 +你可以使用

Control.IsKeyLocked

答案 1 :(得分:37)

使用Framework 2.0及更高版本,您可以使用框架功能

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

答案 2 :(得分:15)

如果有人在WPF中进行开发时遇到此线程,您可以使用.NET 3.0中引入的Keyboard.IsToggled方法:

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

您必须将以下using指令添加到班级的顶部,如果它尚未存在:

using System.Windows.Input;

在内部,IsToggled()方法检查是否为指定键设置了KeyStates.Toggled标志。

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

答案 3 :(得分:7)

检查状态

要检查 CapsLock NumLock ScrollLock 键的状态,您可以使用 Control.IsKeyLocked方法:

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

积极展示状态

由于当您的应用程序没有焦点处理时,锁定键可以打开或关闭,键盘事件的形式不足以检测键锁定状态的变化,您还应该将逻辑置于某些状态其他地方,如表单的激活事件或您需要注册全局键盘钩子。

作为一种简单可靠的解决方案,您可以在Application.Idle事件中查看其状态。表格关闭时,您必须分离空闲事件处理程序。

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