当前位置:  开发笔记 > 编程语言 > 正文

如何获得活动屏幕尺寸?

如何解决《如何获得活动屏幕尺寸?》经验,为你挑选了6个好方法。

我正在寻找的是相当于System.Windows.SystemParameters.WorkArea窗口当前所在的监视器.

澄清: 有问题的窗口WPF不是WinForm.



1> Jeff Yates..:

Screen.FromControl,Screen.FromPointScreen.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);
  }
}


在我的Windows 10 Pro(v10.0.14393)上的4监视器系统上面向.NET 4.5的VS 2015 WPF应用程序中,监视器上显示"window"_我的主要部分(例如,它的"顶部<0"),"FromHandle"返回我的主显示器的`屏幕`(即使`窗口`在辅助显示器中_完全_)!?!叹.看起来我必须自己搜索`Screen.AllScreens`数组.为什么事情不能"正常"?!?Arrrrgh.

2> Pyttroll..:

您可以使用它来获取主屏幕的桌面工作区边界:

System.Windows.SystemParameters.WorkArea

这对于获得主屏幕的大小也很有用:

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


我很困惑......这似乎只能返回主要的屏幕尺寸.我想知道窗口当前处于的屏幕尺寸...

3> 742..:

您可能还需要:

SystemParameters.VirtualScreenWidth

SystemParameters.VirtualScreenHeight

获得所有显示器的组合尺寸,而不是特别是一个.



4> R.Rusev..:

添加不使用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 );
        }



5> faulty..:

添加到ffpf

Screen.FromControl(this).Bounds



6> aDoubleSo..:

注意窗户的比例因子(100%/ 125%/ 150%/ 200%).您可以使用以下代码获取实际屏幕大小:

SystemParameters.FullPrimaryScreenHeight
SystemParameters.FullPrimaryScreenWidth

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有