我正在使用以下代码来读取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
。另外,我不明白为什么交替印刷机应该返回不同的值。
这里发生了什么?
答案 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;
}
它并没有完全回答这个问题,但我希望它能解决你的问题。