检测Silverlight中是否打开或关闭CapsLock

Ari*_*iel 3 c# keyboard silverlight silverlight-5.0

您可能会发现是否已按下CapsLock键订阅KeyDown/KeyUp事件.然后根据该输入切换CapsLock的状态.这种方法的问题是您需要CapsLock键的初始状态才能开始切换.

一个应用程序可能是在登录页面上给用户一个通知(这是我需要的).

顺便说一句,我正在使用Silverlight 5.

编辑

这里发布的解决方案说:

然而,您可以通过使用实际在onKeyDown发送的KeyEventArgs.PlatformKeyCode来查明Capslock是否已启用.您可以在此处查找大写密钥的虚拟密钥代码:http: //msdn.microsoft.com/en-us/库/ ms927178.aspx

使用此解决方案,您无法确定CapsLock状态,因为KeyEventArgs.PlatformKeyCode返回"表示按下或释放的键的整数值(取决于引发的事件)".所以,如果大写锁定已打开,并且按键A,那么KeyEventArgs.PlatformKeyCode = 65,并且在另一方面,如果大写锁定已关闭,按下键A,然后KeyEventArgs.PlatformKeyCode = 65.

换句话说,您无法根据KeyEventArgs.PlatformKeyCode属性确定CapsLock是否已启用.


这个问题的答案似乎也有一个解决方案,它检查两件事:

  1. 键入的字母为大写,而未按下Shift键
  2. 键入的字母为小写,按下Sift

这两种情况都暗示CapsLock是On,但是这个解决方案也存在问题,给定一个KeyEventArgs,您可以知道键盘中按下的键,但无法知道该键输出的Char.

Bry*_*ant 7

我建议使用行为进行此检测,因为您可以挂钩到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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这是示例代码,因此可能存在错误.只是试图证明它是如何完成的.