次のように WM_GETMINMAXINFO をフックする WPF アプリにカスタム Windows 実装があります。
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の前にフックできる「移動モニター」メッセージがあるかどうかはわかりません。「通常の」ウィンドウは問題なく動作するため、それを行う方法があると思います。