UWP/WinRT: GetKeyState 返回意外值

UWP/WinRT: GetKeyState returning unexpected values

我正在使用以下代码读取 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 会 return 枚举 CoreVirtualKeyStates - None 中的三个可能值之一( 0), 向下 (1), 锁定 (2).

但是,我得到的与调试代码非常不同。每当按下一个键而Ctrl没有被按下时,它输出2。每隔一次Ctrl被按下,它交替输出1或3。

3 甚至不是此枚举中的值,并且 Ctrl 不应该被锁定,因为没有 CapsLock 的等价物。另外,我不明白为什么交替按压应该 returning 不同的值。

这是怎么回事?

尽管结果与文档中描述的不一样,但 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;
}

它没有完全回答问题,但我希望它能解决您的问题。