【问题标题】:Detect whether CapsLock is on or off in Silverlight在 Silverlight 中检测 CapsLock 是打开还是关闭
【发布时间】:2011-11-20 10:42:40
【问题描述】:

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

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

顺便说一句,我使用的是 Silverlight 5。

编辑

here 发布的解决方案说:

但是,您可以通过使用来确定 Capslock 是否开启 实际在 onKeyDown 发送的 KeyEventArgs.PlatformKeyCode。您可以 在此处查找大写锁定的虚拟键代码: http://msdn.microsoft.com/en-us/library/ms927178.aspx

使用此解决方案,您无法确定 CapsLock 状态,因为KeyEventArgs.PlatformKeyCode 返回“表示按下或释放键的整数值(取决于引发的事件)”。因此,如果 CapsLock 处于打开状态并且按下键 A 则 KeyEventArgs.PlatformKeyCode = 65,另一方面,如果 CapsLock 处于关闭状态并且按下键 A 则 KeyEventArgs.PlatformKeyCode = 65

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


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

  1. 输入的字母为大写且未按下 Shift 键
  2. 输入的字母为小写并​​按下 Sift

这两种情况都意味着 CapsLock 处于打开状态,但这种解决方案也存在问题,给定一个 KeyEventArgs,您可以知道键盘上按下的键,但无法知道该键输出的 Char。

【问题讨论】:

  • 或许可以看到这篇文章:forums.silverlight.net/post/185708.aspx
  • 相关帖子:How to determine if the Caps Lock is toggled in a Silverlight Application?。从我目前所读到的内容看来,如果不使用 Silverlight 中的键事件,就不可能检测到大写锁定。 :(
  • 但是你真的不想在用户开始输入密码框之前提醒他们大写锁定已打开。也许我的用户名全部大写,所以我希望大写锁定并且不要打扰我。但是,当我输入密码时,我看不到它处于打开状态,因此一个很好的警报(如在 Windows 中)会很有帮助。
  • @Bryant 你说得对,在按下任何键之前不需要显示这个,所以我改变了问题的标题。

标签: c# silverlight keyboard silverlight-5.0


【解决方案1】:

我建议使用 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;
            }
        }
    }
}

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

【讨论】:

    【解决方案2】:

    区域键检测

        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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2011-10-20
      • 2013-03-11
      相关资源
      最近更新 更多