Подтвердить что ты не робот

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

Как я могу найти состояние ключей NumLock, CapsLock и ScrollLock в .net?

4b9b3361

Ответ 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;

EDIT: выше для Framework 1.1, для рамки 2.0 + вы можете использовать

Control.IsKeyLocked

Ответ 3

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

Ответ 4

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

Для проверки состояния клавиш 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);
}