public static extern bool GetCursorPos(out POINT point);
public static extern bool ScreenToClient(IntPtr hwnd, ref POINT point);
public static IntPtr DescendantWindowFromCursor(IntPtr hwndParent, out POINT point) { POINT cursor; if (!GetCursorPos(out cursor)) { point = new POINT(); return IntPtr.Zero; } return DescendantWindowFromPoint(hwndParent, cursor, out point); }
public static IntPtr DescendantWindowFromPoint(IntPtr hwndParent, POINT absPoint, out POINT relativePoint) { while (true) { relativePoint = absPoint; ScreenToClient(hwndParent, ref relativePoint); IntPtr child = ChildWindowFromPoint(hwndParent, relativePoint); if (child == IntPtr.Zero || child == hwndParent) return child; hwndParent = child; } }
public static extern IntPtr ChildWindowFromPoint(IntPtr hwndParent, POINT point);
public static IntPtr DescendantWindowFromPoint(IntPtr hwndParent, POINT absPoint, out POINT relativePoint) { while (true) { relativePoint = absPoint; ScreenToClient(hwndParent, ref relativePoint); IntPtr child = ChildWindowFromPoint(hwndParent, relativePoint); if (child == IntPtr.Zero || child == hwndParent) { return(child); } hwndParent = child; } }