UWP / WinRT:GetKeyState返回意外值

时间:2015-10-29 20:23:31

标签: win-universal-app c++-cx

我正在使用以下代码来读取Ctrl密钥的密钥状态:

void OnKeyDown(Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e)
{
    auto ctrlState = Core::CoreWindow::GetForCurrentThread()->GetKeyState(VirtualKey::Control);

    //Debug code:
    int ctrlInt = (int)ctrlState;
    auto inputText = "\nctrlState is: " + ctrlInt + "\n";
    auto wstringText = std::wstring(inputText->Data());
    OutputDebugString(wstringText.c_str());

基于documentation,我希望调用GetKeyState将从枚举CoreVirtualKeyStates中返回三个可能值中的一个 - 无(0),向下(1),锁定( 2)。

但是,我得到的与调试代码有很大不同。每当按下一个键并且没有按下Ctrl时,它就会输出2.每按一次Ctrl,它就会输出1或3。

3甚至不是此枚举中的值,并且Ctrl不应该被锁定,因为没有等效于CapsLock。另外,我不明白为什么交替印刷机应该返回不同的值。

这里发生了什么?

1 个答案:

答案 0 :(得分:3)

即使结果不是文档中描述的,3应该是一个组合值,等于Down | Locked所以你可以忽略Locked标志并检查Down标志:

void OnKeyDown(Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) {
    auto ctrlState = Core::CoreWindow::GetForCurrentThread()->GetKeyState(VirtualKey::Control);
    bool isControlPressed = (ctrlState & Core::CoreWindow::CoreVirtualKeyStates.Down) == Core::CoreWindow::CoreVirtualKeyStates.Down;
}

或者您可以使用GetKeyStateAsync,其工作方式如文档中所述:

void OnKeyDown(Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) {
    auto ctrlState = Core::CoreWindow::GetForCurrentThread()->GetKeyStateAsync(VirtualKey::Control);
    bool isControlPressed = ctrlState == Core::CoreWindow::CoreVirtualKeyStates.Down;
}

它并没有完全回答这个问题,但我希望它能解决你的问题。