У меня есть приложение wpf, и я управляю максимальным размером с помощью WmGetMinMaxInfo:
private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
IntPtr monitorContainingApplication = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
if (monitorContainingApplication != System.IntPtr.Zero)
{
MONITORINFO monitorInfo = new MONITORINFO();
GetMonitorInfo(monitorContainingApplication, monitorInfo);
RECT rcWorkArea = monitorInfo.rcWork;
RECT rcMonitorArea = monitorInfo.rcMonitor;
mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);
mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);
mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);
mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);
mmi.ptMaxTrackSize.x = mmi.ptMaxSize.x;
mmi.ptMaxTrackSize.y = mmi.ptMaxSize.y;
}
Marshal.StructureToPtr(mmi, lParam, true);
}
В моем окне установлено значение:
WindowStyle="None"
ResizeMode="CanResizeWithGrip"
AllowsTransparency="True"
У меня возникла странная проблема, когда я свернул приложение в развернутом состоянии и при нажатии для возврата на значок панели задач, чтобы вернуться в приложение развернутого окна.
Он не занимает весь экран, кажется, используется разрешение основного экрана. У меня такой случай, когда у меня нет одинакового разрешения между основным и второстепенным экраном (очевидно, что мой вторичный экран больше первого).
У вас есть идеи, в чем проблема? Windows особенности? Есть какая-то работа?
РЕШЕНИЕ: Я решил свою проблему с идеей Keithe rnet, чтобы не пересчитывать, когда windowState свернуто. Спасибо!
private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
IntPtr monitorContainingApplication = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
if (monitorContainingApplication != System.IntPtr.Zero)
{
MONITORINFO monitorInfo = new MONITORINFO();
GetMonitorInfo(monitorContainingApplication, monitorInfo);
RECT rcWorkArea = monitorInfo.rcWork;
RECT rcMonitorArea = monitorInfo.rcMonitor;
if (Application.Current.MainWindow.WindowState != WindowState.Minimized)
{
mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);
mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);
mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);
mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);
mmi.ptMaxTrackSize.x = mmi.ptMaxSize.x;
mmi.ptMaxTrackSize.y = mmi.ptMaxSize.y;
lastGoodMaxTrackSize = mmi.ptMaxTrackSize;
lastGoodMaxPosition = mmi.ptMaxPosition;
lastGoodMaxSize = mmi.ptMaxSize;
}
else
{
mmi.ptMaxPosition = lastGoodMaxPosition;
mmi.ptMaxSize = lastGoodMaxSize;
mmi.ptMaxTrackSize = lastGoodMaxTrackSize;
}
mmi = AdjustWorkingAreaForAutoHide(monitorContainingApplication, mmi);
}
Marshal.StructureToPtr(mmi, lParam, true);
}