private void WmDpiChanged(ref Message m) { var oldDeviceDpi = _deviceDpi; var newDeviceDpi = Win32.SignedHIWORD(m.WParam); var suggestedRect = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT)); ScaleFactor = DpiHelper.GetScaleFactorForCurrentWindow(Handle); _deviceDpi = newDeviceDpi; var maxSizeState = MaximumSize; var minSizeState = MinimumSize; MinimumSize = Size.Empty; MaximumSize = Size.Empty; User32.SetWindowPos(Handle, IntPtr.Zero, suggestedRect.left, suggestedRect.top, suggestedRect.Width, suggestedRect.Height, SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOACTIVATE); var scaleFactor = (float)newDeviceDpi / oldDeviceDpi; MinimumSize = DpiHelper.CalcScaledSize(minSizeState, new SizeF(scaleFactor, scaleFactor)); MaximumSize = DpiHelper.CalcScaledSize(maxSizeState, new SizeF(scaleFactor, scaleFactor)); OnWmDpiChanged(oldDeviceDpi, newDeviceDpi, suggestedRect.ToRectangle()); }