【发布时间】:2009-02-23 11:58:38
【问题描述】:
如何在 .NET 中找到 NumLock、CapsLock 和 ScrollLock 键的状态?
【问题讨论】:
-
@PeterMortensen 是否真的值得编辑所有这些问题,无缘无故地将它们带到首页?
如何在 .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(及更高版本),您可以使用:
【讨论】:
(bool) Console.CapsLock。
使用 Framework 2.0 及以上版本,您可以使用框架功能:
Control.IsKeyLocked(Keys) Method
public static bool NumlockActive()
{
return Control.IsKeyLocked(Keys.NumLock);
}
【讨论】:
如果有人在 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,
}
【讨论】:
检查状态
要检查 CapsLock、NumLock 和 ScrollLock 键的状态,您可以使用
Control.IsKeyLocked方法:
var capsLockIsOn = Control.IsKeyLocked(Keys.CapsLock);
在状态栏中的 UI 中主动显示状态
由于当您的应用程序没有焦点时可以打开或关闭锁定键,处理表单的键盘事件不足以检测键锁定状态的变化,您还应该将您的逻辑放在其他地方比如表单的激活事件,或者您需要注册一个全局键盘挂钩。
作为一种简单可靠的解决方案,您可以在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);
}
【讨论】: