2009-02-23 1 views

ответ

42

Импорт 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 + вы можете использовать

Control.IsKeyLocked

+1

Возможно, я ошибаюсь, но не будет ли это работать строго для выпуска Windows? Первый вариант напрямую подключается к .dll, а второй требует System.Windows.Forms –

+0

Если вы не используете WinForms (консоли для примера), вы можете использовать '(bool) Console.CapsLock'. –

10

Если кто попадается эту тему, развивая в 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); 

Активно Показать ГНА 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); 
} 
+0

Что делать, если ваше приложение не работает? например, вы открываете окно входа в систему, и вы хотите предупредить пользователя о том, что кепки находятся на –

+1

@LeandroTupone Когда отображается окно входа в систему, это означает, что ваше приложение запущено.Чтобы просто проверить состояние ключа, когда вам нужно, вы можете использовать первый вариант в ответе. Также, чтобы активно узнать о состоянии, вы можете использовать второй вариант. –