Как узнать размер всего рабочего стола? Не "рабочая область" и не "разрешение экрана", оба из которых относятся только к одному экрану. Я хочу узнать общую ширину и высоту виртуального рабочего стола, часть которого отображается на каждом мониторе.
У вас есть два варианта:
Объект systemparameters.VirtualScreenWidth Объект systemparameters.VirtualScreenHeight
Системы сведения.VirtualScreen.Ширина Системы сведения.VirtualScreen.Высота
Используйте первый вариант если вы разрабатываете приложения WPF.
Я думаю, что пришло время обновить этот ответ с помощью LINQ, который позволяет легко получить весь размер рабочего стола с помощью одного выражения.
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) видно.
EDIT:
Я только что понял, что код может быть немного проще, если использовать 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
Это не отвечает на вопрос, а просто добавляет дополнительную информацию о точке (местоположении) окна в пределах всех экранов).
Используйте приведенный ниже код, чтобы узнать, находится ли точка (например, последнее известное местоположение окна) в границах всего Рабочего стола. Если нет, сбросьте местоположение окна на значение по умолчанию pBaseLoc;
Код не учитывает панель задач или другие панели инструментов, вы можете сделать это самостоятельно.
Пример использования: Сохраните расположение окна в базе данных со станции A. Пользователь входит на станцию B с двумя мониторами и перемещает окно на второй монитор, выходит из системы, сохраняя новое местоположение. Возвращается на станцию A и окно не будет отображаться, если не использовать вышеприведенный код.
Дальнейшее решение было реализовано путем сохранения идентификатора пользователя и IP станции (& winLoc) в базу данных или локальный файл пользовательских префов для данного приложения, а затем загрузки пользовательских префов для этой станции & приложения.
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);
}
}
Вы можете использовать границы системы.Рисунок`.
Вы можете создать функцию, как это
public System.Windows.Form.Screen[] GetScreens(){
Screen[] screens = Screen.AllScreens;
return screens;
}
и чем вы можете получить один, два и т. д. в переменной такой:
System.Windows.Form.Screen[] screens = func.GetScreens();
System.Windows.Form.Screen screen1 = screens[0];
затем вы можете сделать границы экрана:
System.Drawing.Rectangle screen1Bounds = screen1.Bounds;
С помощью этого кода Вы получите все свойства, как ширина
, высота
и т. д.
Этот метод возвращает прямоугольник, который содержит все экраны' границы, используя самые низкие значения, для левой и верхней, и высшими ценностями для правой и нижней...
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);
}
Я думаю, что лучший способ попасть в "Реал" и экран-размер, чтобы получить значения прямо из видео-контроллер.
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);
}
}
}
}
Это должно сделать работу ;) Привет ...
Получить размер виртуальный дисплей без каких-либо зависимостей
public enum SystemMetric
{
VirtualScreenWidth = 78, // CXVIRTUALSCREEN 0x0000004E
VirtualScreenHeight = 79, // CYVIRTUALSCREEN 0x0000004F
}
[DllImport("user32.dll")]
public static extern int GetSystemMetrics(SystemMetric metric);
public static Size GetVirtualDisplaySize()
{
var width = GetSystemMetrics(SystemMetric.VirtualScreenWidth);
var height = GetSystemMetrics(SystemMetric.VirtualScreenHeight);
return new Size(width, height);
}