检测Silverlight中的CapsLock是否开启或关闭
本文关键字:是否 Silverlight 中的 CapsLock 检测 | 更新日期: 2023-09-27 18:09:06
您可能会发现如果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处于On状态并且按下了键A,则KeyEventArgs.PlatformKeyCode = 65
,另一方面,如果CapsLock处于off状态并且按下了键A,则KeyEventArgs.PlatformKeyCode = 65
。
换句话说,您无法根据KeyEventArgs.PlatformKeyCode
属性确定CapsLock是否启用。
这个问题的答案似乎也有一个解决方案,它检查两件事:
- 输入的字母是大写且未按下Shift
- 输入小写字母,按下Sift
这两种情况都意味着CapsLock是On的,但这种解决方案也有一个问题,给定KeyEventArgs,您可以知道键盘中按下的键,但无法知道该键输出的字符。
我建议使用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;
}
}
}
}
注意:这是示例代码,因此可能存在错误。我只是想示范一下怎么做
region 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