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

有帮助吗?

解决方案

导入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

其他提示

如果有人遇到这个线程,而在WPF开发时,可以使用的 Keyboard.IsToggled 其被引入在方法.NET 3.0:

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,
}

检查状态

检查状态 大写锁定, 数字键盘(的第一个键滚动锁 你可以使用的键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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top