C#現在の画面の幅と位置を取得

3440 ワード

前のブログ「C#現在の画面DPIを取得」では、現在の画面のDPI設定を取得する方法について説明しました
この章では、現在のウィンドウがある画面の情報の取得方法について説明します.

現在の画面情報


現在単一画面の場合は、メイン画面を直接取得できます.
    var primaryScreen = Screen.PrimaryScreen;

現在マルチスクリーンの場合は、ウィンドウハンドルからScreen情報を取得することをお勧めします.
    var window = Window.GetWindow(ExportButton);// 
    var intPtr = new WindowInteropHelper(window).Handle;// 
    var screen = Screen.FromHandle(intPtr);// 

画面の縦横/位置の取得


DpiPercent


DPI変換比例定数、DpiPercent=96;
なぜDpiPercentは96ですか?1/96インチの「デバイス無関係単位サイズ」という概念があります.例:
【物理単位寸法】=1/96インチ*96 dpi=1ピクセル;
【物理単位サイズ】=1/96インチ*120 dpi=1.25ピクセル;
WPF単位とシステムDPIについては、「WPFプログラミング宝典」の関連章を参照してください.

Screen.Bounds


Boundsは画面の解像度に対応し、Boundsを通過する.Widthは画面の幅を取得するため、WPF単位のアスペクトに変換する必要がある.
手順:
  • 現在の画面の物理寸法(X/Y方向の画素)を取得する(X方向currentGraphicsのように).DpiX/DpiPercent
  • Screen.Boundsの情報はWPF単位の情報に変換される--例えば高度screen.Bounds.Width/dpiXRatio
  •     using (Graphics currentGraphics = Graphics.FromHwnd(intPtr))
        {
            double dpiXRatio = currentGraphics.DpiX / DpiPercent;
            double dpiYRatio = currentGraphics.DpiY / DpiPercent;
            var width = screen.Bounds.Width / dpiXRatio;
            var height = screen.Bounds.Height / dpiYRatio;
            var left = screen.Bounds.Left / dpiXRatio;
            var top = screen.Bounds.Top / dpiYRatio;
        }

      

    画面の縦横を直接取得


    システムを通過することもできる.Windows.SystemParametersは、メイン画面情報を直接取得しますが、このクラスではメイン画面の高さと幅しか取得できません.
    ここでの横幅は実際の横幅を指す.
    メイン画面:
        var screenHeight = SystemParameters.PrimaryScreenHeight;
        var screenWidth = SystemParameters.PrimaryScreenWidth;

    マルチスクリーン:
        var primaryScreenHeight = SystemParameters.FullPrimaryScreenHeight;
        var primaryScreenWidth = SystemParameters.FullPrimaryScreenWidth;

    現在の作業領域:(タスクバーの領域を除く)
        var workAreaWidth = SystemParameters.WorkArea.Size.Width;
        var workAreaHeight = SystemParameters.WorkArea.Size.Height;

     
    キーワード:WPF単位、画面幅/位置