C#:获取完整的桌面大小?

我如何找出整个桌面的大小? 不是 “工作区”,而不是 “屏幕分辨率”,两者都只涉及一个屏幕。 我想知道每个显示器只显示一部分的虚拟桌面的总宽度和高度。

你有两个select:

  1. PresentationFramework.dll

    SystemParameters.VirtualScreenWidth SystemParameters.VirtualScreenHeight 
  2. System.Windows.Forms.dll中

     SystemInformation.VirtualScreen.Width SystemInformation.VirtualScreen.Height 

如果您开发一个WPF应用程序,请使用第一个选项

我认为现在是时候把这个答案更新到一个小小的LINQ,这使得用一个expression式就可以轻松获得整个桌面的大小。

 Console.WriteLine( Screen.AllScreens.Select(screen=>screen.Bounds) .Aggregate(Rectangle.Union) .Size ); 

我的原始答案如下:


我想你想要的是这样的:

 int minx, miny, maxx, maxy; minx = miny = int.MaxValue; maxx = maxy = int.MinValue; foreach(Screen screen in Screen.AllScreens){ var bounds = screen.Bounds; minx = Math.Min(minx, bounds.X); miny = Math.Min(miny, bounds.Y); maxx = Math.Max(maxx, bounds.Right); maxy = Math.Max(maxy, bounds.Bottom); } Console.WriteLine("(width, height) = ({0}, {1})", maxx - minx, maxy - miny); 

请记住,这并不能说明整个故事。 多台显示器可能是错开的,或者是非矩形的。 因此,可能不是(minx,miny)和(maxx,maxy)之间的所有空间都是可见的。

编辑:

我刚刚意识到,使用Rectangle.Union的代码可能会更简单一些:

 Rectangle rect = new Rectangle(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue); foreach(Screen screen in Screen.AllScreens) rect = Rectangle.Union(rect, screen.Bounds); Console.WriteLine("(width, height) = ({0}, {1})", rect.Width, rect.Height); 

检查:

 SystemInformation.VirtualScreen.Width SystemInformation.VirtualScreen.Height 

这并没有回答这个问题,而只是增加了对所有屏幕中窗口的Point(位置)的更多的了解。

使用下面的代码来找出一个点(例如最后一个窗口的已知位置)是否在整个桌面的范围内。 如果没有,将窗口的位置重置为默认的pBaseLoc ;

代码不考虑TaskBar或其他工具栏,你自己在那里。

使用示例:将窗口位置保存到来自站点A的数据库。 用户使用2台监视器login到B站 ,并将窗口移动到第2个监视器,注销保存新位置。 回到车站A ,除非使用上述代码,否则不会显示窗口。

我进一步的解决scheme实现将用户ID和工作站的IP(&winLoc)保存到数据库或本地用户的prefs文件为一个给定的应用程序,然后加载在该用户pref为该工作站和应用程序。

 Point pBaseLoc = new Point(40, 40) int x = -500, y = 140; Point pLoc = new Point(x, y); bool bIsInsideBounds = false; foreach (Screen s in Screen.AllScreens) { bIsInsideBounds = s.Bounds.Contains(pLoc); if (bIsInsideBounds) { break; } }//foreach (Screen s in Screen.AllScreens) if (!bIsInsideBounds) { pLoc = pBaseLoc; } this.Location = pLoc; 

要获得显示器的物理像素大小,您可以使用这个。

 static class DisplayTools { [DllImport("gdi32.dll")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); private enum DeviceCap { Desktopvertres = 117, Desktophorzres = 118 } public static Size GetPhysicalDisplaySize() { Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.Desktopvertres); int physicalScreenWidth = GetDeviceCaps(desktop, (int)DeviceCap.Desktophorzres); return new Size(physicalScreenWidth, physicalScreenHeight); } } 

您可以使用System.Drawing的边界。

你可以创build一个这样的function

 public System.Windows.Form.Screen[] GetScreens(){ Screen[] screens = Screen.AllScreens; return screens; } 

比你可以像这样的variables获得屏幕一,二,等等:

 System.Windows.Form.Screen[] screens = func.GetScreens(); System.Windows.Form.Screen screen1 = screens[0]; 

那么你可以得到屏幕的界限:

 System.Drawing.Rectangle screen1Bounds = screen1.Bounds; 

有了这个代码,你将得到所有的属性,如WidthHeight

我认为获得“真实”屏幕尺寸的最好方法是直接从video控制器获取值。


  using System; using System.Management; using System.Windows.Forms; namespace MOS { public class ClassMOS { public static void Main() { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController"); foreach (ManagementObject queryObj in searcher.Get()) { Console.WriteLine("CurrentHorizontalResolution: {0}", queryObj["CurrentHorizontalResolution"]); Console.WriteLine("-----------------------------------"); Console.WriteLine("CurrentVerticalResolution: {0}", queryObj["CurrentVerticalResolution"]); } } catch (ManagementException e) { MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); } } } } 

这应该做的工作;)问候…

此方法通过使用Left和Top的最小值以及Right和Bottom的最大值返回包含所有屏幕边界的矩形。

 static Rectangle GetDesktopBounds() { var l = int.MaxValue; var t = int.MaxValue; var r = int.MinValue; var b = int.MinValue; foreach(var screen in Screen.AllScreens) { if(screen.Bounds.Left < l) l = screen.Bounds.Left ; if(screen.Bounds.Top < t) t = screen.Bounds.Top ; if(screen.Bounds.Right > r) r = screen.Bounds.Right ; if(screen.Bounds.Bottom > b) b = screen.Bounds.Bottom; } return Rectangle.FromLTRB(l, t, r, b); }