diff --git a/modules/juce_gui_basics/native/juce_Windowing_windows.cpp b/modules/juce_gui_basics/native/juce_Windowing_windows.cpp index 3ea7128f31..7fb79dc932 100644 --- a/modules/juce_gui_basics/native/juce_Windowing_windows.cpp +++ b/modules/juce_gui_basics/native/juce_Windowing_windows.cpp @@ -2336,18 +2336,43 @@ public: static bool offerKeyMessageToJUCEWindow (MSG& m) { - if (m.message == WM_KEYDOWN || m.message == WM_KEYUP) - { - if (Component::getCurrentlyFocusedComponent() != nullptr) - { - if (auto* peer = getOwnerOfWindow (m.hwnd)) - { - ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { m.hwnd }; + auto* peer = getOwnerOfWindow (m.hwnd); - return m.message == WM_KEYDOWN ? peer->doKeyDown (m.wParam) - : peer->doKeyUp (m.wParam); - } - } + if (peer == nullptr) + return false; + + auto* focused = Component::getCurrentlyFocusedComponent(); + + if (focused == nullptr || focused->getPeer() != peer) + return false; + + constexpr UINT keyMessages[] { WM_KEYDOWN, + WM_KEYUP, + WM_SYSKEYDOWN, + WM_SYSKEYUP, + WM_CHAR }; + + const auto messageTypeMatches = [&] (UINT msg) { return m.message == msg; }; + + if (std::none_of (std::begin (keyMessages), std::end (keyMessages), messageTypeMatches)) + return false; + + ScopedThreadDPIAwarenessSetter threadDpiAwarenessSetter { m.hwnd }; + + if (m.message == WM_CHAR) + return peer->doKeyChar ((int) m.wParam, m.lParam); + + TranslateMessage (&m); + + switch (m.message) + { + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + return peer->doKeyDown (m.wParam); + + case WM_KEYUP: + case WM_SYSKEYUP: + return peer->doKeyUp (m.wParam); } return false;