简而言之:
如果用户按下了 VirtualKey Enum 列表中未包含的键之一,我如何在全球 Windows 应用商店应用程序中正确验证页面?(http://msdn.microsoft.com/en-us/library/windows/apps/windows.system.virtualkey.aspx)在我的例子中,我需要处理“,”和“´”字符。
详细的:
我被困在如何在我的 Windows Store 应用程序中正确验证来自不同键盘布局的键盘输入。这里有很多关于它的帖子,但似乎没有人有答案。
我的应用程序接受页面上的键盘输入(没有任何文本框)以验证键序列。我已经连接了 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
我通过使用以下技术测试了用更多字符扩展 VirtualKey 枚举:http: //useranswer.com/answer/how-to-convert-a-virtualkey-to-a-char-for-non-us-keyboard-layouts -in-winrt/ 但 Windows 应用程序认证工具包失败,“此应用程序类型不支持 user32.dll 中的 API 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;
}