1

简而言之:

如果用户按下了 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;
    }
4

1 回答 1

1

这不是虚拟键的工作方式。它们代表键盘上的特定键,并具有独立于键盘布局和用户语言的代码。然而,它们产生的字符在很大程度上取决于活动的键盘布局、修饰键(Alt、Ctrl、Shift)的状态以及之前是否按下了任何死键。试图自己弄清楚这一点会让人流泪,至少因为某些字符在偏远国家的键盘布局上不可用。然而,虚拟钥匙始终存在。

对于加速键,您从不关心该字符。您只关心虚拟键代码和修饰键状态。因此,如果您将 Alt+A 定义为加速键,那么全世界的每个人都会按下位于 capslock 键右侧的键。请注意,您遇到文档问题,该密钥并非到处都标记为“A”。但这只是正常本地化工作的一部分。

于 2013-07-15T13:20:55.657 回答