screentoclient (user32)
Last changed: sh0ber@Stack Overflow-24.127.131.201

.
Summary
The ScreenToClient function converts the screen coordinates of a specified point on the screen to client-area coordinates.

C# Signature:

[DllImport("user32.dll")]
static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);

VB Signature:

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function ScreenToClient(ByVal hWnd As IntPtr, ByRef lpPoint As POINT) As Boolean
    '
    End Function

User-Defined Types:

POINT

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

Context
using ScreenToClient to convert to a managed Rectangle. hWnd is assumed to be the handle to the form/control you need coords for

RECT rct;
POINT topLeft;
POINT bottomRight;

/** Getting a windows position **/
GetWindowRect(hWnd, out rct);

/** assign RECT coods to POINT **/
topLeft.X = rct.Left;
topLeft.Y = rct.Top;
bottomRight.X = rct.Right;
bottomRight.Y = rct.Bottom;

/** this takes the POINT, which is using screen coords (0,0 in top left screen) and converts them into coords inside specified window (0,0 from  top left of hWnd) **/
ScreenToClient(hWnd, ref topLeft);
ScreenToClient(hWnd, ref bottomRight);

int width = bottomRight.X - topLeft.X;
int height = bottomRight.Y - topLeft.Y;

Rectangle R = new Rectangle(topLeft.X, topLeft.Y, width, height);

WARNING

The last bit of the above example is incorrect. The correct client left/top will be retrieved but the width/height will be inaccurate. This function reports the distance of any given screen coordinates from the origin of our hwnd's ClientRect. In this way it allows us to deduce the location of the ClientRect origin given any other point. It does not allow us to deduce the location of any other point of the ClientRect, just the origin. The above example errs by trying to use this to deduce the distance from the ClientRect origin to the WindowRect bottom/right. This is not helpful because it will not give the accurate height and width of the ClientRect since the WindowRect bottom/right will be further out and different than the yet unknown ClientRect. The origin is deducible because that's where the function reports from, but this is not true of any other point in the ClientRect. So the proper way to use this is to make only the first call to ScreenToClient and then call GetClientRect to retrieve the ClientRect dimensions and add them to the origin.

Alternative Managed API:

Control.PointToClient

Documentation