private IntPtr _HandleNCHitTest(WM uMsg, IntPtr wParam, IntPtr lParam, out bool handled) { IntPtr lRet = IntPtr.Zero; handled = false; // Give DWM a chance at this first. if (_OnVista && UseGlassFrame) { // If we're on Vista, give the DWM a chance to handle the message first. handled = NativeMethods.DwmDefWindowProc(_hwnd, uMsg, wParam, lParam, out lRet); } // Handle letting the system know if we consider the mouse to be in our effective non-client area. // If DWM already handled this by way of DwmDefWindowProc, then respect their call. if (IntPtr.Zero == lRet) { var mousePosScreen = new Point(Utility.GET_X_LPARAM(lParam), Utility.GET_Y_LPARAM(lParam)); Rect windowPosition = _GetWindowRect(); HT ht = _HitTestNca( DpiHelper.DeviceRectToLogical(windowPosition), DpiHelper.DevicePixelsToLogical(mousePosScreen)); // Don't blindly respect HTCAPTION. // We want UIElements in the caption area to be actionable so run through a hittest first. if (ht == HT.CAPTION) { Point mousePosWindow = mousePosScreen; mousePosWindow.Offset(-windowPosition.X, -windowPosition.Y); mousePosWindow = DpiHelper.DevicePixelsToLogical(mousePosWindow); if (_HitTestUIElements(mousePosWindow)) { ht = HT.NOWHERE; } } handled = HT.NOWHERE != ht; lRet = new IntPtr((int)ht); } return(lRet); }
/// <summary>Display the system menu at a specified location.</summary> /// <param name="screenLocation">The location to display the system menu, in logical screen coordinates.</param> public void ShowSystemMenu(Point screenLocation) { Point physicalScreenLocation = DpiHelper.LogicalPixelsToDevice(screenLocation); _ShowSystemMenu(physicalScreenLocation); }
private void _SetRoundingRegion(WINDOWPOS?wp) { const int MONITOR_DEFAULTTONEAREST = 0x00000002; // We're early - WPF hasn't necessarily updated the state of the window. // Need to query it ourselves. WINDOWPLACEMENT wpl = NativeMethods.GetWindowPlacement(_hwnd); if (wpl.showCmd == SW.SHOWMAXIMIZED) { int left; int top; if (wp.HasValue) { left = wp.Value.x; top = wp.Value.y; } else { Rect r = _GetWindowRect(); left = (int)r.Left; top = (int)r.Top; } IntPtr hMon = NativeMethods.MonitorFromWindow(_hwnd, MONITOR_DEFAULTTONEAREST); MONITORINFO mi = NativeMethods.GetMonitorInfo(hMon); RECT rcMax = mi.rcWork; // The location of maximized window takes into account the border that Windows was // going to remove, so we also need to consider it. rcMax.Offset(-left, -top); IntPtr hrgn = NativeMethods.CreateRectRgnIndirect(rcMax); NativeMethods.SetWindowRgn(_hwnd, hrgn, NativeMethods.IsWindowVisible(_hwnd)); } else { int width; int height; // Use the size if it's specified. if (null != wp && !Utility.IsFlagSet(wp.Value.flags, (int)SWP.NOSIZE)) { width = wp.Value.cx; height = wp.Value.cy; } else if (null != wp && (_lastRoundingState == _window.WindowState)) { return; } else { Rect r = _GetWindowRect(); width = (int)r.Width; height = (int)r.Height; } _lastRoundingState = _window.WindowState; IntPtr hrgn = IntPtr.Zero; if (RoundCorners && 0 != RoundCornersRadius) { Point radius = DpiHelper.LogicalPixelsToDevice(new Point(RoundCornersRadius, RoundCornersRadius)); hrgn = NativeMethods.CreateRoundRectRgn(0, 0, width, height, (int)radius.X, (int)radius.Y); } else { hrgn = NativeMethods.CreateRectRgn(0, 0, width, height); } NativeMethods.SetWindowRgn(_hwnd, hrgn, NativeMethods.IsWindowVisible(_hwnd)); } }