简而言之:
如果用户按下VirtualKey枚举列表中未包含的某个键,我如何在全球Windows应用商店应用中正确验证? (http://msdn.microsoft.com/en-us/library/windows/apps/windows.system.virtualkey.aspx)在我的情况下,我需要处理的是“,”和“'”字符。
详细说明:
我坚持如何在我的Windows应用商店应用中正确验证来自不同键盘布局的键盘输入。这里有很多帖子,但没有人似乎有答案。
我的应用程序接受页面上的键盘输入(没有任何文本框)来验证键序列。 我已经连接了Window.Current.Dispatcher.AcceleratorKeyActivated事件来处理所有输入(参见:How to detect ALT (Menu) button keydown on global page level in a WinRT app)。正如您在下面的代码示例中所看到的,我使用AcceleratorKeyEventArgs来找出VirtualKey被按下的内容。
它在我的瑞典语键盘上运行得非常好,根据我的理解,它对世界各地的所有用户都有效,因为无论键盘布局或语言设置如何,虚拟键都是相同的。
现在我的问题:
Windows.System.VirtualKey枚举只定义了165个按钮,我需要验证的两个键不包括在内:“,”和“'”。
当我使用Eng / Swe键盘设置按“'”键时,AcceleratorKeyEventArgs.VirtualKey会给我“219”
当我使用Eng / US键盘设置时按“'”键(我在记事本中检查了哪个键会产生“'”,AcceleratorKeyEventArgs.VirtualKey会给我“188”。
我认为这里描述了同样的问题: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/c3099f93-6365-4254-abba-d512b05f2edd/winrt-equivalent-for-mapvirtualkey
我测试了使用此tecnique扩展具有更多字符的VirtualKey枚举: http://useranswer.com/answer/how-to-convert-a-virtualkey-to-a-char-for-non-us-keyboard-layouts-in-winrt/ 但Windows应用程序认证工具包失败,“此应用程序类型不支持 API userV.dll中的MapVirtualKeyA ”
示例代码:
public PractisePage()
{
this.InitializeComponent();
Window.Current.Dispatcher.AcceleratorKeyActivated +=Dispatcher_AcceleratorKeyActivated;
_vm = (PractisePageVm)DataContext;
}
private void Dispatcher_AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args)
{
switch (args.EventType)
{
case CoreAcceleratorKeyEventType.SystemKeyUp:
case CoreAcceleratorKeyEventType.KeyUp:
_vm.HandleKeyUp(args.VirtualKey);
break;
case CoreAcceleratorKeyEventType.SystemKeyDown:
case CoreAcceleratorKeyEventType.KeyDown:
if (args.KeyStatus.WasKeyDown == false)
{
_vm.HandleKeyDown(args.VirtualKey);
}
break;
}
args.Handled = true;
}
答案 0 :(得分:1)
这不是虚拟键的工作方式。它们代表键盘上的特定键,并且具有独立于键盘布局和用户语言的代码。但是它们产生的角色在很大程度上取决于活动键盘布局,修改键的状态(Alt,Ctrl,Shift)以及是否先前按下了任何死键。试图自己解决这个问题会导致眼泪,至少是因为某些角色在遥远的国家的键盘布局中无法使用。但是,虚拟密钥始终存在。
对于加速键,您从不关心该角色。您只关心虚拟键代码和修饰键状态。因此,如果您将Alt + A定义为加速器,那么全世界的每个人都会按下位于大写锁定键右侧的按键。请注意, 会出现文档问题,该密钥在任何地方都未标记为“A”。但这只是正常本地化工作的一部分。