我在 WM_GETMINMAXINFO 挂钩的 WPF 应用程序中有一个自定义窗口实现,如下所示:
private void MaximiseWithTaskbar(System.IntPtr hwnd, System.IntPtr lParam)
{
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
if (monitor != System.IntPtr.Zero)
{
MONITORINFO monitorInfo = new MONITORINFO();
GetMonitorInfo(monitor, 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.ptMinTrackSize.x = Convert.ToInt16(this.MinWidth * (desktopDpiX / 96));
mmi.ptMinTrackSize.y = Convert.ToInt16(this.MinHeight * (desktopDpiY / 96));
}
Marshal.StructureToPtr(mmi, lParam, true);
}
这一切都是一种享受,它允许我最大化一个无边界窗口而无需将它放在任务栏上,这很棒,但它真的不喜欢使用新的 Win7 键盘快捷键在显示器之间移动。
每当使用 Win+Shift+Left/Right 移动应用程序时,都会收到 WM_GETMINMAXINFO 消息,正如我所料,但 MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST) 返回应用程序刚刚从中移动的监视器,而不是它正在移动的监视器TO,因此,如果显示器具有不同的分辨率,则窗口最终大小错误。
我不确定是否还有其他我可以调用的东西,除了 MonitorFromWindow,或者是否有一个“移动监视器”消息我可以在 WM_GETMINMAXINFO 之前挂钩。我假设有一种方法可以做到这一点,因为“普通”窗口工作得很好。