4

Microsoft.Windows.ShellDLL と .NET 4.0を使用して、WPF でカスタム ウィンドウを作成しました。

問題は、タスクバーが自動非表示に設定されていて、ウィンドウが最大化されている場合、ウィンドウがタスクバーを完全に覆うことです。いくつかの異なる解決策 (最初のいくつかの Google の結果) を試しましたが、実際に機能するものはありません。

タスクバーが自動的に非表示にされていない場合、パッケージが使用するメソッドはMahApps.Metro、ウィンドウを画面の下部から 1 ピクセル離して設定します。

解決策が必要です

  1. .NET 4.0 で動作
  2. タスクバーがどちら側にドッキングされていても機能します
  3. タスクバーが常に表示と自動非表示の両方に設定されている場合に機能します。
4

1 に答える 1

3

カスタマイズされた 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

...そして、ステータスバーを尊重するようにカスタマイズしたウィンドウを配置するために必要な寸法が得られます。

于 2013-08-10T20:44:03.297 に答える