カスタマイズされた WPF ウィンドウは、タスク バーが占める領域を尊重しません。これを行うには、Win32 API からのサポートが必要です。
最初に必要な方法は...
[DllImport("user32.dll")]
public static extern IntPtr MonitorFromWindow(IntPtr hwnd, int dwFlags);
MonitorFromWindow 関数は、指定されたウィンドウの外接する四角形との最大の交差領域を持つディスプレイ モニターへのハンドルを取得します。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd145064(v=vs.85).aspx
dwFlags = 2 を設定します。
次は…
[DllImport("user32.dll")]
public static extern bool GetMonitorInfo(HandleRef hmonitor,
[In, Out] MonitorInfoEx monitorInfo);
GetMonitorInfo 関数は、ディスプレイ モニターに関する情報を取得します。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd144901(v=vs.85).aspx
MonitorInfoEx 構造体は次のようになります...
[StructLayout(LayoutKind.Sequential)]
public class MonitorInfoEx
{
public int cbSize;
public Rect rcMonitor;
public Rect rcWork;
public int dwFlags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)]
public char[] szDevice;
}
MONITORINFOEX 構造体には、ディスプレイ モニターに関する情報が含まれています。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd145066(v=vs.85).aspx
渡される Rect は...
[StructLayout(LayoutKind.Sequential)]
public struct Rect
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
ここで特に興味深いのは、現在の解像度で DPI の作業領域を取得していることです。
最後に、PresentationCore (WPF) の Interop 名前空間から HwndSource.FromHwnd メソッドが必要になります。
すべての情報をまとめたら、CompositionTarget.TransformFromDevice を使用して... レンダリング先デバイスからこのターゲットに座標を変換するために使用できるマトリックスを取得します。 http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.transformfromdevice.aspx
...そして、ステータスバーを尊重するようにカスタマイズしたウィンドウを配置するために必要な寸法が得られます。