【发布时间】:2020-11-03 23:55:52
【问题描述】:
我有一个 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功能 ? 有什么解决办法吗?
解决方案: 我已经用 Keithernet 的想法解决了我的问题,即在最小化 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);
}
【问题讨论】:
-
你能发布你的 WmGetMinMaxInfo 代码吗?
-
WindowStyle="None" WindowState="Maximized" ResizeMode="NoResize" 跟随链接stackoverflow.com/questions/35009880/…
-
我刚刚编辑了@Keithernet 和 NoResize 参数并没有改变问题