public static Point TransformToScreen(Point point, Visual relativeTo) { var hwndSource = PresentationSource.FromVisual(relativeTo) as HwndSource; var root = hwndSource.RootVisual; // Translate the point from the visual to the root. var transformToRoot = relativeTo.TransformToAncestor(root); var pointRoot = transformToRoot.Transform(point); // Transform the point from the root to client coordinates. var m = Matrix.Identity; var transform = VisualTreeHelper.GetTransform(root); if (transform != null) { m = Matrix.Multiply(m, transform.Value); } var offset = VisualTreeHelper.GetOffset(root); m.Translate(offset.X, offset.Y); var pointClient = m.Transform(pointRoot); // Convert from “device-independent pixels” into pixels. pointClient = hwndSource.CompositionTarget.TransformToDevice.Transform(pointClient); var pointClientPixels = new Native.PointW(); pointClientPixels.X = (0 < pointClient.X) ? (int)(pointClient.X + 0.5) : (int)(pointClient.X - 0.5); pointClientPixels.Y = (0 < pointClient.Y) ? (int)(pointClient.Y + 0.5) : (int)(pointClient.Y - 0.5); // Transform the point into screen coordinates. var pointScreenPixels = pointClientPixels; Native.ClientToScreen(hwndSource.Handle, ref pointScreenPixels); //Native.GetCurrentPositionEx(hwndSource.Handle, out pointScreenPixels); //Native.GetWindowOrgEx(hwndSource.Handle, out pointScreenPixels); return(new Point(pointScreenPixels.X, pointScreenPixels.Y)); }
static Point TransformToScreen(Point point, Visual relativeTo) { HwndSource hwndSource = PresentationSource.FromVisual(relativeTo) as HwndSource; Visual root = hwndSource.RootVisual; // Translate the point from the visual to the root. GeneralTransform transformToRoot = relativeTo.TransformToAncestor(root); Point pointRoot = transformToRoot.Transform(point); // Transform the point from the root to client coordinates. Matrix m = Matrix.Identity; Transform transform = VisualTreeHelper.GetTransform(root); if (transform != null) { m = Matrix.Multiply(m, transform.Value); } Vector offset = VisualTreeHelper.GetOffset(root); m.Translate(offset.X, offset.Y); Point pointClient = m.Transform(pointRoot); // Convert from “device-independent pixels” into pixels. pointClient = hwndSource.CompositionTarget.TransformToDevice.Transform(pointClient); Native.POINT pointClientPixels = new Native.POINT(); pointClientPixels.x = (0 < pointClient.X) ? (int)(pointClient.X + 0.5) : (int)(pointClient.X - 0.5); pointClientPixels.y = (0 < pointClient.Y) ? (int)(pointClient.Y + 0.5) : (int)(pointClient.Y - 0.5); // Transform the point into screen coordinates. Native.POINT pointScreenPixels = pointClientPixels; Native.ClientToScreen(hwndSource.Handle, pointScreenPixels); return(new Point(pointScreenPixels.x, pointScreenPixels.y)); }