From 5ee9d24e36d72e6ef4689f3c4845f00467dde29d Mon Sep 17 00:00:00 2001 From: reuk Date: Thu, 4 Jan 2024 14:20:19 +0000 Subject: [PATCH] WindowsHooks: Use appropriate dpi awareness when forwarding mouse wheel messages --- .../native/juce_Windowing_windows.cpp | 12 ++++-------- .../native/juce_WindowsHooks_windows.cpp | 11 ++++++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/juce_gui_basics/native/juce_Windowing_windows.cpp b/modules/juce_gui_basics/native/juce_Windowing_windows.cpp index 7ac37adb55..32cd2ad204 100644 --- a/modules/juce_gui_basics/native/juce_Windowing_windows.cpp +++ b/modules/juce_gui_basics/native/juce_Windowing_windows.cpp @@ -3196,7 +3196,7 @@ private: doMouseEvent (getCurrentMousePos(), MouseInputSource::defaultPressure); } - ComponentPeer* findPeerUnderMouse (Point& localPos) + std::tuple> findPeerUnderMouse() { auto currentMousePos = getPOINTFromLParam ((LPARAM) GetMessagePos()); @@ -3207,8 +3207,7 @@ private: if (peer == nullptr) peer = this; - localPos = peer->globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (currentMousePos), hwnd).toFloat()); - return peer; + return std::tuple (peer, peer->globalToLocal (convertPhysicalScreenPointToLogical (pointFromPOINT (currentMousePos), hwnd).toFloat())); } static MouseInputSource::InputSourceType getPointerType (WPARAM wParam) @@ -3242,9 +3241,7 @@ private: wheel.isSmooth = false; wheel.isInertial = false; - Point localPos; - - if (auto* peer = findPeerUnderMouse (localPos)) + if (const auto [peer, localPos] = findPeerUnderMouse(); peer != nullptr) peer->handleMouseWheel (getPointerType (wParam), localPos, getMouseEventTime(), wheel); } @@ -3257,9 +3254,8 @@ private: if (getGestureInfo != nullptr && getGestureInfo ((HGESTUREINFO) lParam, &gi)) { updateKeyModifiers(); - Point localPos; - if (auto* peer = findPeerUnderMouse (localPos)) + if (const auto [peer, localPos] = findPeerUnderMouse(); peer != nullptr) { switch (gi.dwID) { diff --git a/modules/juce_gui_basics/native/juce_WindowsHooks_windows.cpp b/modules/juce_gui_basics/native/juce_WindowsHooks_windows.cpp index 97afe888ee..fe7927ecb0 100644 --- a/modules/juce_gui_basics/native/juce_WindowsHooks_windows.cpp +++ b/modules/juce_gui_basics/native/juce_WindowsHooks_windows.cpp @@ -55,9 +55,14 @@ private: auto& hs = *(MOUSEHOOKSTRUCTEX_*) lParam; if (auto* comp = Desktop::getInstance().findComponentAt ({ hs.pt.x, hs.pt.y })) - if (comp->getWindowHandle() != nullptr) - return PostMessage ((HWND) comp->getWindowHandle(), WM_MOUSEWHEEL, - hs.mouseData & 0xffff0000, (hs.pt.x & 0xffff) | (hs.pt.y << 16)); + { + if (auto* target = static_cast (comp->getWindowHandle())) + { + const ScopedThreadDPIAwarenessSetter scope { target }; + return PostMessage (target, WM_MOUSEWHEEL, + hs.mouseData & 0xffff0000, MAKELPARAM (hs.pt.x, hs.pt.y)); + } + } } return CallNextHookEx (getSingleton()->mouseWheelHook, nCode, wParam, lParam);