Как я могу узнать состояние NumLock, CapsLock и ScrollLock в .net?

StackOverflow https://stackoverflow.com/questions/577411

  •  05-09-2019
  •  | 
  •  

Вопрос

Как я могу узнать состояние клавиш NumLock, CapsLock и ScrollLock в .net?

Это было полезно?

Решение

Импортируйте функцию 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

Другие советы

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

Если кто-нибудь встретит эту тему во время разработки в 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,
}

Проверить состояние

Чтобы проверить состояние CapsLock, NumLock и ПрокруткаLock ключи, которые вы можете использовать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