[C#] 활성 화면 크기를 얻으려면 어떻게해야합니까?

내가 찾고있는 것은 System.Windows.SystemParameters.WorkArea 것은 현재 창이있는 모니터 .

설명 : 문제 의 창이 WPF아닙니다 WinForm.



답변

Screen.FromControl, Screen.FromPoint그리고 Screen.FromRectangle이 당신을 도움이 될 것입니다. 예를 들어 WinForms에서는 다음과 같습니다.

class MyForm : Form
{
  public Rectangle GetScreen()
  {
    return Screen.FromControl(this).Bounds;
  }
}

WPF에 해당하는 전화를 모릅니다. 따라서이 확장 방법과 같은 작업을 수행해야합니다.

static class ExtensionsForWPF
{
  public static System.Windows.Forms.Screen GetScreen(this Window window)
  {
    return System.Windows.Forms.Screen.FromHandle(new WindowInteropHelper(window).Handle);
  }
}


답변

이를 사용하여 기본 화면의 데스크탑 작업 공간 경계를 확보 할 수 있습니다.

System.Windows.SystemParameters.WorkArea

이것은 또한 기본 화면의 크기를 얻는 데 유용합니다.

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


답변

또한 다음이 필요할 수 있습니다.

특히 모든 모니터의 크기를 합치 지 않습니다.


답변

WinForms를 사용하지 않고 NativeMethods를 사용하는 솔루션 추가. 먼저 필요한 기본 메소드를 정의해야합니다.

public static class NativeMethods
{
    public const Int32 MONITOR_DEFAULTTOPRIMERTY = 0x00000001;
    public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;


    [DllImport( "user32.dll" )]
    public static extern IntPtr MonitorFromWindow( IntPtr handle, Int32 flags );


    [DllImport( "user32.dll" )]
    public static extern Boolean GetMonitorInfo( IntPtr hMonitor, NativeMonitorInfo lpmi );


    [Serializable, StructLayout( LayoutKind.Sequential )]
    public struct NativeRectangle
    {
        public Int32 Left;
        public Int32 Top;
        public Int32 Right;
        public Int32 Bottom;


        public NativeRectangle( Int32 left, Int32 top, Int32 right, Int32 bottom )
        {
            this.Left = left;
            this.Top = top;
            this.Right = right;
            this.Bottom = bottom;
        }
    }


    [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )]
    public sealed class NativeMonitorInfo
    {
        public Int32 Size = Marshal.SizeOf( typeof( NativeMonitorInfo ) );
        public NativeRectangle Monitor;
        public NativeRectangle Work;
        public Int32 Flags;
    }
}

그런 다음 모니터 핸들과 이와 같은 모니터 정보를 얻습니다.

        var hwnd = new WindowInteropHelper( this ).EnsureHandle();
        var monitor = NativeMethods.MonitorFromWindow( hwnd, NativeMethods.MONITOR_DEFAULTTONEAREST );

        if ( monitor != IntPtr.Zero )
        {
            var monitorInfo = new NativeMonitorInfo();
            NativeMethods.GetMonitorInfo( monitor, monitorInfo );

            var left = monitorInfo.Monitor.Left;
            var top = monitorInfo.Monitor.Top;
            var width = ( monitorInfo.Monitor.Right - monitorInfo.Monitor.Left );
            var height = ( monitorInfo.Monitor.Bottom - monitorInfo.Monitor.Top );
        }


답변

ffpf에 추가

Screen.FromControl(this).Bounds


답변

창의 배율을주의하십시오 (100 % / 125 % / 150 % / 200 %). 다음 코드를 사용하여 실제 화면 크기를 얻을 수 있습니다.

SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth


답변

내 첫 번째 창을 열기 전에 화면 해상도를 원했기 때문에 실제로 화면 크기를 측정하기 전에 보이지 않는 창을 여는 빠른 솔루션 (두 창을 모두 열어 두려면 창 매개 변수를 창에 맞게 조정해야 함) 같은 화면-주로 WindowStartupLocation중요합니다)

Window w = new Window();
w.ResizeMode = ResizeMode.NoResize;
w.WindowState = WindowState.Normal;
w.WindowStyle = WindowStyle.None;
w.Background = Brushes.Transparent;
w.Width = 0;
w.Height = 0;
w.AllowsTransparency = true;
w.IsHitTestVisible = false;
w.WindowStartupLocation = WindowStartupLocation.Manual;
w.Show();
Screen scr = Screen.FromHandle(new WindowInteropHelper(w).Handle);
w.Close();