Windows runtime 如果虚拟键枚举中不包含用户在WinRT应用程序中按下的字符,如何找出该字符?

Windows runtime 如果虚拟键枚举中不包含用户在WinRT应用程序中按下的字符,如何找出该字符?,windows-runtime,microsoft-metro,windows-store-apps,winrt-xaml,Windows Runtime,Microsoft Metro,Windows Store Apps,Winrt Xaml,简而言之: 如果用户按下VirtualKey枚举列表中未包含的某个键,如何在全球Windows应用商店应用程序中正确验证页面?()在我的例子中,我需要处理“,”和“')字符 详细说明: 我对如何在我的Windows应用商店应用程序中正确验证不同键盘布局的键盘输入感到困惑。这里有很多关于它的帖子,但似乎没有人有答案 我的应用程序接受页面上的键盘输入(没有任何文本框)以验证按键序列。 我已连接到Window.Current.Dispatcher.AcceleratoryActivated事件以处理所

简而言之:

如果用户按下VirtualKey枚举列表中未包含的某个键,如何在全球Windows应用商店应用程序中正确验证页面?()在我的例子中,我需要处理“,”和“')字符

详细说明:

我对如何在我的Windows应用商店应用程序中正确验证不同键盘布局的键盘输入感到困惑。这里有很多关于它的帖子,但似乎没有人有答案

我的应用程序接受页面上的键盘输入(没有任何文本框)以验证按键序列。 我已连接到Window.Current.Dispatcher.AcceleratoryActivated事件以处理所有输入(请参阅:)。正如您在下面的代码示例中所看到的,我使用AcceleratorWorkeyEventArgs查找按下了什么VirtualKey

它在我的瑞典键盘上工作得非常出色,据我所知,它同样适用于世界各地的所有用户,因为无论键盘布局还是语言设置,virtualkeys都是一样的

现在我的问题是:

Windows.System.VirtualKey枚举只定义了165个按钮,我需要验证的两个键不包括:“,”和“')

当我使用Eng/Swe键盘设置时,按“')键,AcceleratorWorkeyEventargs.VirtualKey会显示“219”

当我使用英语/美国键盘设置时,按下“')键(我在记事本中检查了哪个键会生成“'),AcceleratorWorkYeventargs.VirtualKey会给我“188”

我认为这里也描述了同样的问题:

我使用以下技术测试了使用更多字符扩展VirtualKey枚举: 但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;
    }

这不是虚拟键的工作方式。它们代表键盘上的特定键,并且具有独立于键盘布局和用户语言的代码。然而,它们产生的字符在很大程度上取决于活动键盘布局和修改键(Alt、Ctrl、Shift)的状态如果你自己想弄清楚这一点会让你流泪,一点也不,因为在一个遥远的国家,有些字符在键盘布局上是不可用的。然而,虚拟键总是存在的


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

这不是虚拟键的工作方式。它们代表键盘上的特定键,并且具有独立于键盘布局和用户语言的代码。但它们产生的字符在很大程度上取决于活动键盘布局和modi的状态快速键(Alt、Ctrl、Shift)以及之前是否按下了任何无效键。试图自己弄清楚这一点会导致流泪,一点也不因为某些字符在遥远的国家的键盘布局上不可用。但是虚拟键始终存在


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

谢谢你的帮助。你是说我甚至不能使用上面的代码来检查virtualkey枚举列表中包含的字符,比如字符A:if args.virtualkey==virtualkey.A?还有我最初的问题。我没有办法确定用户是否键入了a“,”或“')”?例如,keybord导师应用程序会定义一个句子,然后对用户按下的每个键做出反应,并告知其字符是否正确。VirtualKey.A识别键,而不是字符A。它会在(比如)中文机器上生成一个非常不同的字符。键盘导师应用程序应该只关注字符。因此您将始终使用CoreWindow.CharacterReceived事件,而不是使用按键或虚拟键。感谢您的解释。我想我必须扔掉我的应用程序,但至少我学会了如何处理键盘输入:)谢谢您的帮助。你是说我甚至不能使用上面的代码来检查virtualkey枚举列表中包含的字符,比如字符A:if args.virtualkey==virtualkey.A?至于我最初的问题。我无法确定用户是否键入了“,”或“')?例如,keybord导师应用程序会定义一个句子,然后对用户按下的每个键做出反应,并告知该键是否为正确字符。VirtualKey.A识别该键,而不是字符A。例如,它会在中文机器上生成一个非常不同的字符。键盘导师应用程序应该只关注字符。因此,您应该始终使用CoreWindow.CharacterReceived事件,而不要使用按键或虚拟键。感谢您的解释。我想我必须把我的应用程序扔进垃圾桶,但至少我学会了如何处理键盘输入:)