WindowFromPoint() Caveats

Last reviewed: November 2, 1995
Article ID: Q65882
The information in this article applies to:
  • Microsoft Windows Software Development Kit (SDK) versions 3.0 and 3.1
  • Microsoft Win32 Application Programming Interface (API) included with:

        - Microsoft Windows NT versions 3.5 and 3.51
        - Microsoft Windows 95 version 4.0
    

SUMMARY

When the coordinates passed to the WindowFromPoint() function correspond to a disabled, hidden, or transparent child window, the handle of that window's parent is returned.

To retrieve the handle of a disabled, hidden, or transparent child window, given a point, the ChildWindowFromPoint() function must be used.

MORE INFORMATION

The following code fragment demonstrates the use of the ChildWindowFromPoint() function during the processing of a WM_MOUSEMOVE message. This code finds the topmost child window at a given point, regardless of the current state of the window.

In this fragment, hWnd is the window receiving this message and is assumed to have captured the mouse via the SetCapture() function.

HWND hWndChild, hWndPoint; POINT pt;

    .
    .
    .
    case WM_MOUSEMOVE:
        pt.x = LOWORD(lParam);
        pt.y = HIWORD(lParam);

        /*
         * Convert point to screen coordinates. When the mouse is
         * captured, mouse coordinates are given in the client
         * coordinates of the window with the capture.
         */
        ClientToScreen(hWnd, &pt);

        /*
         * Get the handle of the window at this point. If the window
         * is a control that is disabled, hidden, or transparent, then
         * the parent's handle is returned.
         */
        hWndPoint = WindowFromPoint(pt);

        if (hWndPoint == NULL)
            break;

        /*
         * To look at the child windows of hWnd, screen coordinates
         * need to be converted to client coordinates.
         */
        ScreenToClient (hWndPoint, &pt);

        /*
         * Search through all child windows at this point. This
         * will continue until no child windows remain.
         */
        while (TRUE)
            {
            hWndChild = ChildWindowFromPoint(hWndPoint, pt);

            if (hWndChild && hWndChild != hWndPoint)
                hWndPoint = hWndChild;
            else
                break;
            }

        // Do whatever processing is desired on hWndPoint

        break;


Additional reference words: 3.00 3.10 3.50 3.51 4.00 95
KBCategory: kbui
KBSubcategory: UsrWndw


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: November 2, 1995
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.