Определить, включен ли CapsLock в Silverlight

Вы можете узнать, была ли нажата клавиша CapsLock, подписавшись на событие KeyDown / KeyUp. А затем переключите состояние CapsLock на основе этого ввода. Проблема с этим подходом заключается в том, что вам нужно начальное состояние клавиши CapsLock, чтобы начать переключать это.

Одним из применений этого может быть уведомление пользователя на странице входа в систему (это то, что мне нужно).

Кстати, я использую Silverlight 5.

ИЗМЕНИТЬ

В решении, размещенном здесь, говорится:

Однако вы можете узнать, включен ли Capslock, используя KeyEventArgs.PlatformKeyCode, который фактически отправляется на onKeyDown. Вы можете найти код виртуального ключа для capslock здесь: http://msdn.microsoft.com/en-us/library/ms927178.aspx

С помощью этого решения вы не можете определить состояние CapsLock, потому что KeyEventArgs.PlatformKeyCode возвращает «целочисленное значение, представляющее нажатую или отпущенную клавишу (в зависимости от того, какое событие возникает)». Таким образом, если CapsLock включен и нажата клавиша A, тогда KeyEventArgs.PlatformKeyCode = 65, и, с другой стороны, если CapsLock выключен и нажата клавиша A, то KeyEventArgs.PlatformKeyCode = 65.

Другими словами, вы не можете определить, включен ли CapsLock, на основе свойства KeyEventArgs.PlatformKeyCode.


Ответ на этот вопрос, похоже, тоже имеет решение, он проверяет две вещи:

  1. набрана буква в верхнем регистре, Shift не нажимается
  2. набрана буква нижнего регистра и нажата кнопка Sift

Оба этих случая подразумевают, что CapsLock включен, но есть также проблема с этим решением, учитывая KeyEventArgs, вы можете знать нажатую клавишу на клавиатуре, но не можете знать Char, выводимый этой клавишей.


person Ariel    schedule 19.09.2011    source источник
comment
Возможно, посмотрите этот пост: forum.silverlight.net/post/185708.aspx   -  person Brad Christie    schedule 19.09.2011
comment
Связанное сообщение: Как определить, включен ли Caps Lock в приложении Silverlight?. Не похоже, что можно обнаружить блокировку заглавных букв без использования ключевого события в silverlight из того, что я читал до сих пор. :(   -  person Sam    schedule 19.09.2011
comment
Но вы действительно не хотите предупреждать пользователя о том, что заглавные буквы включены, пока они не начнут вводить пароль в любом случае. Возможно, мое имя пользователя написано заглавными буквами, поэтому я хочу, чтобы заглавные буквы были зафиксированы, и не беспокоить меня по этому поводу. Однако я не вижу, чтобы он был включен, когда я ввожу свой пароль, поэтому хорошее предупреждение (как в Windows) было бы полезно.   -  person Bryant    schedule 19.09.2011
comment
@Bryant, ты прав, нет необходимости показывать это перед нажатием любой клавиши, поэтому я изменил заголовок вопроса.   -  person Ariel    schedule 19.09.2011


Ответы (2)


Я бы предложил использовать Behavior для этого обнаружения, поскольку вы можете подключиться к событиям PasswordChanged и KeyDown, чтобы определить, включен ли Caps Lock. Вот быстрое поведение, которое я написал, чтобы определить, включен ли Caps Lock. Вы можете привязаться к поведению CapsLockOn и использовать что-то вроде поведения состояния данных, чтобы скрыть / показать ваше предупреждающее сообщение.

public class DetectCapsLockBehavior : Behavior<PasswordBox>
{
    private int _lastKey;
    private ModifierKeys _modifiers;

    [Category("Settings")]
    public bool CapsLockOn
    {
        get { return (bool)GetValue(CapsLockOnProperty); }
        set { SetValue(CapsLockOnProperty, value); }
    }

    public static readonly DependencyProperty CapsLockOnProperty = DependencyProperty.Register("CapsLockOn", typeof(bool), typeof(DetectCapsLockBehavior), new PropertyMetadata(null));

    protected override void OnAttached()
    {
        AssociatedObject.PasswordChanged += new RoutedEventHandler(AssociatedObject_PasswordChanged);
        AssociatedObject.KeyDown += new KeyEventHandler(AssociatedObject_KeyDown);
    }

    void AssociatedObject_KeyDown(object sender, KeyEventArgs e)
    {
        _lastKey = e.PlatformKeyCode;
        _modifiers = Keyboard.Modifiers;
    }

    void AssociatedObject_PasswordChanged(object sender, RoutedEventArgs e)
    {
        if (_lastKey >= 0x41 && _lastKey <= 0x5a)
        {
            var lastChar = AssociatedObject.Password.Last();
            if (_modifiers != ModifierKeys.Shift)
            {
                CapsLockOn = char.ToLower(lastChar) != lastChar;
            }
            else
            {
                CapsLockOn = char.ToUpper(lastChar) != lastChar;
            }
        }
    }
}

ПРИМЕЧАНИЕ. Это пример кода, поэтому могут быть ошибки. Просто пытаюсь продемонстрировать, как это можно сделать.

person Bryant    schedule 19.09.2011

Ключи региона

    bool bCaps = false; 
    bool bIns = false; 
    bool bNum = false; 

    public void FloatableWindow_KeyDown(object sender, KeyEventArgs e) 
    { 



        switch (e.Key) 
        { 
            case Key.CapsLock: 
                bCaps = !bCaps; 
                lbl_caps.Opacity = (bCaps) ? 1 : 0.5; 
                break; 

            case Key.Insert: 
                bIns = !bIns; 
                lbl_ins.Opacity = (bIns) ? 1 : 0.5; 
                break; 

            case Key.Unknown: 
                { 
                    if (e.PlatformKeyCode == 144) 
                    { 
                        { 
                            bNum = !bNum; 
                            lbl_num.Opacity = (bNum) ? 1 : 0.5; 
                        } 
                    } 
                    break; 
                } 
        } 


    } 

    #endregion 
person shirivo    schedule 21.12.2011