diff --git a/modules/juce_gui_basics/native/juce_Windowing_windows.cpp b/modules/juce_gui_basics/native/juce_Windowing_windows.cpp index fd353b0d8a..f3ba42d8b1 100644 --- a/modules/juce_gui_basics/native/juce_Windowing_windows.cpp +++ b/modules/juce_gui_basics/native/juce_Windowing_windows.cpp @@ -1782,8 +1782,22 @@ public: if (! r.withZeroOrigin().contains (localPos)) return false; - auto w = WindowFromPoint (D2DUtilities::toPOINT (convertLogicalScreenPointToPhysical (localPos + getScreenPosition(), - hwnd))); + const auto screenPos = convertLogicalScreenPointToPhysical (localPos + getScreenPosition(), hwnd); + + if (trueIfInAChildWindow) + { + // Quick check to see whether the point is inside the client bounds + RECT rect; + GetClientRect (hwnd, &rect); + POINT points[2]; + memcpy (points, &rect, sizeof (points)); + MapWindowPoints (hwnd, nullptr, points, (UINT) std::size (points)); + memcpy (&rect, points, sizeof (points)); + + return PtInRect (&rect, D2DUtilities::toPOINT (screenPos)); + } + + auto w = WindowFromPoint (D2DUtilities::toPOINT (screenPos)); return w == hwnd || (trueIfInAChildWindow && (IsChild (hwnd, w) != 0)); }