[c#] WPF에서 현재 화면의 크기를 얻는 방법은 무엇입니까?

사용하여 기본 화면의 크기를 얻을 수 있다는 것을 알고 있습니다.

System.Windows.SystemParameters.PrimaryScreenWidth;
System.Windows.SystemParameters.PrimaryScreenHeight;

하지만 현재 화면의 크기를 어떻게 알 수 있습니까? (멀티 스크린 사용자가 항상 기본 화면을 사용하는 것은 아니며 모든 화면이 동일한 해상도를 사용하는 것은 아닙니다.)

XAML에서 크기에 액세스 할 수 있으면 좋겠지 만 코드 (C #)로도 충분합니다.



답변

내가 아는 한 현재 모니터의 크기를 가져 오는 기본 WPF 함수는 없습니다. 대신 기본 다중 디스플레이 모니터 함수를 PInvoke 하고 관리되는 클래스로 래핑하고 XAML에서 사용하는 데 필요한 모든 속성을 노출 할 수 있습니다.


답변

System.Windows.Forms에서 화면 주위에 작은 래퍼를 만들었습니다. 현재 모든 것이 작동합니다. “장치 독립 픽셀”에 대해서는 확실하지 않습니다.

public class WpfScreen
{
    public static IEnumerable<WpfScreen> AllScreens()
    {
        foreach (Screen screen in System.Windows.Forms.Screen.AllScreens)
        {
            yield return new WpfScreen(screen);
        }
    }

    public static WpfScreen GetScreenFrom(Window window)
    {
        WindowInteropHelper windowInteropHelper = new WindowInteropHelper(window);
        Screen screen = System.Windows.Forms.Screen.FromHandle(windowInteropHelper.Handle);
        WpfScreen wpfScreen = new WpfScreen(screen);
        return wpfScreen;
    }

    public static WpfScreen GetScreenFrom(Point point)
    {
        int x = (int) Math.Round(point.X);
        int y = (int) Math.Round(point.Y);

        // are x,y device-independent-pixels ??
        System.Drawing.Point drawingPoint = new System.Drawing.Point(x, y);
        Screen screen = System.Windows.Forms.Screen.FromPoint(drawingPoint);
        WpfScreen wpfScreen = new WpfScreen(screen);

        return wpfScreen;
    }

    public static WpfScreen Primary
    {
        get { return new WpfScreen(System.Windows.Forms.Screen.PrimaryScreen); }
    }

    private readonly Screen screen;

    internal WpfScreen(System.Windows.Forms.Screen screen)
    {
        this.screen = screen;
    }

    public Rect DeviceBounds
    {
        get { return this.GetRect(this.screen.Bounds); }
    }

    public Rect WorkingArea
    {
        get { return this.GetRect(this.screen.WorkingArea); }
    }

    private Rect GetRect(Rectangle value)
    {
        // should x, y, width, height be device-independent-pixels ??
        return new Rect
                   {
                       X = value.X,
                       Y = value.Y,
                       Width = value.Width,
                       Height = value.Height
                   };
    }

    public bool IsPrimary
    {
        get { return this.screen.Primary; }
    }

    public string DeviceName
    {
        get { return this.screen.DeviceName; }
    }
}


답변

여기 친구. 이것은 작업 영역의 너비와 높이 만 제공합니다.

System.Windows.SystemParameters.WorkArea.Width
System.Windows.SystemParameters.WorkArea.Height


답변

이것은 창의 왼쪽 상단을 기반으로 현재 화면을 제공합니다. 현재 화면에 대한 정보를 얻으려면 this.CurrentScreen ()을 호출하십시오.

using System.Windows;
using System.Windows.Forms;

namespace Common.Helpers
{
    public static class WindowHelpers
     {
        public static Screen CurrentScreen(this Window window)
         {
             return Screen.FromPoint(new System.Drawing.Point((int)window.Left,(int)window.Top));
         }
     }
}


답변

시간을내어 SystemParameters 멤버를 살펴보십시오.

  • VirtualScreenWidth
  • VirtualScreenHeight

이것은 심지어 스크린의 상대적인 위치를 고려합니다.

두 대의 모니터에서만 테스트되었습니다.


답변

왜 이것을 사용하지 않습니까?

var interopHelper = new WindowInteropHelper(System.Windows.Application.Current.MainWindow);
var activeScreen = Screen.FromHandle(interopHelper.Handle);


답변

System.Windows.Forms 클래스 사용에 익숙하다면 System.Windows.Forms 클래스 참조 를 프로젝트에 추가하면됩니다 .

솔루션 탐색기 -> 참조 -> 참조 추가 …- > (어셈블리 : 프레임 워크) -> 아래로 스크롤하여 System.Windows.Forms 어셈블리-> 확인을 확인 합니다.

이제 System.Windows.Forms를 사용하여 추가 할 수 있습니다 . 이전과 마찬가지로 wpf 프로젝트에서 진술하고 화면을 사용하십시오.