Определите, включен ли CapsLock в Silverlight - PullRequest
3 голосов
/ 19 сентября 2011

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

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

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

EDIT

Решение опубликовано здесь говорит:

Однако вы можете узнать, включен ли 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. набрана буква Upper Case и Shift не нажимается
  2. набранная буква строчная и нажата Sift

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

Ответы [ 2 ]

7 голосов
/ 19 сентября 2011

Я бы предложил использовать Поведение для этого обнаружения, поскольку вы можете подключиться к событиям 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;
            }
        }
    }
}

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

1 голос
/ 21 декабря 2011

регион KeysDetection

    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 
...