private IntPtr _HandleNCHitTest(WM uMsg, IntPtr wParam, IntPtr lParam, out bool handled) { IntPtr intPtr = IntPtr.Zero; handled = false; if (Utility.IsOSVistaOrNewer && this._chromeInfo.GlassFrameThickness != default(Thickness) && this._isGlassEnabled) { handled = NativeMethods.DwmDefWindowProc(this._hwnd, uMsg, wParam, lParam, out intPtr); } if (IntPtr.Zero == intPtr) { Point point = new Point((double)Utility.GET_X_LPARAM(lParam), (double)Utility.GET_Y_LPARAM(lParam)); Rect deviceRectangle = this._GetWindowRect(); HT ht = this._HitTestNca(DpiHelper.DeviceRectToLogical(deviceRectangle), DpiHelper.DevicePixelsToLogical(point)); if (ht != HT.CLIENT) { Point point2 = point; point2.Offset(-deviceRectangle.X, -deviceRectangle.Y); point2 = DpiHelper.DevicePixelsToLogical(point2); IInputElement inputElement = this._window.InputHitTest(point2); if (inputElement != null && WindowChrome.GetIsHitTestVisibleInChrome(inputElement)) { ht = HT.CLIENT; } } handled = true; intPtr = new IntPtr((int)ht); } return(intPtr); }
/// <summary> /// Sets the IsHitTestVisibleInChromeProperty to a MetroWindow template child /// </summary> /// <param name="window">The MetroWindow.</param> /// <param name="name">The name of the template child.</param> /// <param name="hitTestVisible"></param> public static void SetIsHitTestVisibleInChromeProperty <T>(this MetroWindow window, string name, bool hitTestVisible = true) where T : class { if (window == null) { throw new ArgumentNullException(nameof(window)); } var inputElement = window.GetPart <T>(name) as IInputElement; Debug.Assert(inputElement != null, $"{name} is not a IInputElement"); if (WindowChrome.GetIsHitTestVisibleInChrome(inputElement) != hitTestVisible) { WindowChrome.SetIsHitTestVisibleInChrome(inputElement, hitTestVisible); } }
private IntPtr _HandleNCHITTEST(WM uMsg, IntPtr wParam, IntPtr lParam, out bool handled) { // We always want to handle hit-testing handled = true; var dpi = this.AssociatedObject.GetDpi(); // Let the system know if we consider the mouse to be in our effective non-client area. var mousePosScreen = Utility.GetPoint(lParam); //new Point(Utility.GET_X_LPARAM(lParam), Utility.GET_Y_LPARAM(lParam)); var windowPosition = this._GetWindowRect(); var mousePosWindow = mousePosScreen; mousePosWindow.Offset(-windowPosition.X, -windowPosition.Y); mousePosWindow = DpiHelper.DevicePixelsToLogical(mousePosWindow, dpi.DpiScaleX, dpi.DpiScaleY); var ht = this._HitTestNca(DpiHelper.DeviceRectToLogical(windowPosition, dpi.DpiScaleX, dpi.DpiScaleY), DpiHelper.DevicePixelsToLogical(mousePosScreen, dpi.DpiScaleX, dpi.DpiScaleY)); if (ht != HT.CLIENT || this.AssociatedObject.ResizeMode == ResizeMode.CanResizeWithGrip) { // If the app is asking for content to be treated as client then that takes precedence over _everything_, even DWM caption buttons. // This allows apps to set the glass frame to be non-empty, still cover it with WPF content to hide all the glass, // yet still get DWM to draw a drop shadow. var inputElement = this.AssociatedObject.InputHitTest(mousePosWindow); if (inputElement is not null) { if (WindowChrome.GetIsHitTestVisibleInChrome(inputElement)) { return(new IntPtr((int)HT.CLIENT)); } var direction = WindowChrome.GetResizeGripDirection(inputElement); if (direction != ResizeGripDirection.None) { return(new IntPtr((int)this._GetHTFromResizeGripDirection(direction))); } } } return(new IntPtr((int)ht)); }