【问题标题】:How can I find the state of NumLock, CapsLock and ScrollLock in .NET?如何在 .NET 中找到 NumLock、CapsLock 和 ScrollLock 的状态?
【发布时间】:2009-02-23 11:58:38
【问题描述】:

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

【问题讨论】:

  • @PeterMortensen 是否真的值得编辑所有这些问题,无缘无故地将它们带到首页?

标签: c# .net capslock


【解决方案1】:

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

【讨论】:

  • 我在这里可能是错的,但这难道不是严格地仅适用于 Windows 版本吗?第一个选项直接挂钩到 .dll,而第二个选项需要 System.Windows.Forms
  • 如果你不使用WinForms,(例如控制台)你可以使用(bool) Console.CapsLock
【解决方案2】:

使用 Framework 2.0 及以上版本,您可以使用框架功能:

Control.IsKeyLocked(Keys) Method

public static bool NumlockActive()
{
    return Control.IsKeyLocked(Keys.NumLock);
}

【讨论】:

    【解决方案3】:

    如果有人在 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,
    }
    

    【讨论】:

      【解决方案4】:

      检查状态

      要检查 CapsLockNumLockScrollLock 键的状态,您可以使用 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);
      }
      

      【讨论】:

      • 如果您的应用程序没有运行怎么办?例如,您打开一个登录窗口,并希望警告用户 caps 已打开
      • @LeandroTupone 当您的登录窗口出现时,这意味着您的应用程序正在运行。要在需要时检查键的状态,可以使用答案中的第一个选项。此外,要主动了解状态,您可以使用第二个选项。
      猜你喜欢
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多