В моих старых приложениях UWP я мог проверить состояние клавиши клавиатуры в своих обработчиках, например:
void MyControl::UserControl_KeyDown(winrt::IInspectable const& /*sender*/, winrt::KeyRoutedEventArgs const& e)
{
if (e.Key() == winrt::VirtualKey::F6)
{
const auto isShiftPressed = winrt::CoreWindow::GetForCurrentThread().GetKeyState(winrt::VirtualKey::Shift) & winrt::CoreVirtualKeyStates::Down;
// ...
}
}
Но winrt::CoreWindow::GetForCurrentThread() возвращает значение null в WinUI 3. Как мне получить состояния клавиатуры в моем коде?





В официальной документации (API среды выполнения Windows не поддерживаются в настольных приложениях ) вместо этого рекомендуется InputKeyboardSource.GetKeyStateForCurrentThread:
[...] Вместо метода GetKeyState используйте метод InputKeyboardSource.GetKeyStateForCurrentThread, предоставляемый WinUI 3.
void MyControl::UserControl_KeyDown(winrt::IInspectable const& /*sender*/, winrt::KeyRoutedEventArgs const& e)
{
if (e.Key() == winrt::VirtualKey::F6)
{
const auto isShiftPressed = winrt::InputKeyboardSource::GetKeyStateForCurrentThread(winrt::VirtualKey::Shift) & winrt::CoreVirtualKeyStates::Down;
// ...
}
}
См. мой аналогичный вопрос о получении темы пользовательского интерфейса в WinUI 3.
Хотя это проект C#, это также API, который мы остановили в галерее WinUI: github.com/microsoft/WinUI-Gallery/blob/…