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;
}
它没有完全回答问题,但我希望它能解决您的问题。
我正在使用以下代码读取 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;
}
它没有完全回答问题,但我希望它能解决您的问题。