Как я могу найти состояние ключей NumLock, CapsLock и ScrollLock в .net?Как я могу найти состояние 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;
EDIT: выше для рамок 1.1 для Framework 2.0 + вы можете использовать
С 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 и ScrollLock ключи можно использовать Control.IsKeyLocked
метод:
var capsLockIsOn = Control.IsKeyLocked(Keys.CapsLock);
Активно Показать ГНА te
Поскольку клавиши блокировки могут включаться или выключаться, когда ваше приложение не имеет фокуса, клавиатурные события формы недостаточно для обнаружения изменений в состоянии блокировки клавиатуры, и вы также должны поместить свою логику в некоторые другие места, такие как событие активации вашей формы или вам необходимо зарегистрировать глобальный крючок клавиатуры.
Как простое и надежное решение, вы можете проверить их статус в событии 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);
}
Что делать, если ваше приложение не работает? например, вы открываете окно входа в систему, и вы хотите предупредить пользователя о том, что кепки находятся на –
@LeandroTupone Когда отображается окно входа в систему, это означает, что ваше приложение запущено.Чтобы просто проверить состояние ключа, когда вам нужно, вы можете использовать первый вариант в ответе. Также, чтобы активно узнать о состоянии, вы можете использовать второй вариант. –
Возможно, я ошибаюсь, но не будет ли это работать строго для выпуска Windows? Первый вариант напрямую подключается к .dll, а второй требует System.Windows.Forms –
Если вы не используете WinForms (консоли для примера), вы можете использовать '(bool) Console.CapsLock'. –