private static void RaiseNonClientMouseMessageAsClient(IntPtr hwnd, int msg, IntPtr lparam)
        {
            var point = new Core.Platform.Point
            {
                X = NativeMethods.GetXlParam(lparam.ToInt32()),
                Y = NativeMethods.GetYlParam(lparam.ToInt32())
            };

            NativeMethods.ScreenToClient(hwnd, ref point);
            NativeMethods.SendMessage(hwnd, msg + 513 - 161, new IntPtr(PressedMouseButtons),
                                      NativeMethods.MakeParam(point.X, point.Y));
        }
        private IntPtr WmHcHitTest(IntPtr lparam, ref bool handled)
        {
            if (PresentationSource.FromDependencyObject(this) == null)
            {
                return(new IntPtr(0));
            }
            var point1 = new Point(NativeMethods.GetXlParam(lparam.ToInt32()),
                                   NativeMethods.GetYlParam(lparam.ToInt32()));
            var point2 = PointFromScreen(point1);
            DependencyObject visualHit = null;

            VisualUtilities.HitTestVisibleElements(this,
                                                   target =>
            {
                visualHit = target.VisualHit;
                return(HitTestResultBehavior.Stop);
            }, new PointHitTestParameters(point2));
            var num = 0;

            for (; visualHit != null; visualHit = visualHit.GetVisualOrLogicalParent1())
            {
                var nonClientArea = visualHit as INonClientArea;
                if (nonClientArea == null)
                {
                    continue;
                }
                num = nonClientArea.HitTest(point1);
                if (num != 0)
                {
                    break;
                }
            }
            if (num == 0)
            {
                num = 1;
            }
            handled = true;
            return(new IntPtr(num));
        }
        private Cursor GetCursor(IntPtr lParam)
        {
            var  xlParam = NativeMethods.GetXlParam(lParam.ToInt32());
            var  ylParam = NativeMethods.GetYlParam(lParam.ToInt32());
            RECT lpRect;

            NativeMethods.GetWindowRect(new WindowInteropHelper(this).Handle, out lpRect);

            switch (_direction)
            {
            case Dock.Left:
                if (ylParam - 18 < lpRect.Top)
                {
                    return(Cursors.SizeNWSE);
                }
                return(ylParam + 18 > lpRect.Bottom ? Cursors.SizeNESW : Cursors.SizeWE);

            case Dock.Top:
                if (xlParam - 18 < lpRect.Left)
                {
                    return(Cursors.SizeNWSE);
                }
                return(xlParam + 18 > lpRect.Right ? Cursors.SizeNESW : Cursors.SizeNS);

            case Dock.Right:
                if (ylParam - 18 < lpRect.Top)
                {
                    return(Cursors.SizeNESW);
                }
                return(ylParam + 18 > lpRect.Bottom ? Cursors.SizeNWSE : Cursors.SizeWE);

            default:
                if (xlParam - 18 < lpRect.Left)
                {
                    return(Cursors.SizeNESW);
                }
                return(xlParam + 18 > lpRect.Right ? Cursors.SizeNWSE : Cursors.SizeNS);
            }
        }