C#: Получить полный настольный размер?

Битовые поля C

  1. - они не хорошо указаны языком и как они работают, компилятор, зависимый и архитектурно-зависимый.
  2. часто трудно найти, где конкретный символ определяется в большой массе кода, особенно если тот символ производится макросом. Который напоминает мне...
  3. препроцессор является довольно ужасным взломом, поддающимся всем видам злоупотребления.
  4. отсутствие целых чисел стандартного размера (исправленный uint* _ t в последнее время, но существуют партии и много старого кода, плавающего вокруг там с пользовательскими определениями типов или #defines для DWORD, WORD, БАЙТА, и т.д.)
  5. Отсутствие чего-то сродни cpan.org Perl (хотел бы быть неправильным относительно того.)

Редактирование: При размышлении о CPAN для C я думал..., что будет я называть такую вещь, и мысль "ccan" и поиск с помощью Google его, я столкнулся с этим: http://ccan.ozlabs.org/

Это, кажется, находится пока еще в его младенчестве все же.

74
задан Roman Starkov 30 November 2009 в 19:06
поделиться

2 ответа

Я думаю, что пришло время обновить этот ответ с помощью небольшого 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) видно.

РЕДАКТИРОВАТЬ:

Я только что понял, что код может быть немного проще, используя 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);
28
ответ дан 24 November 2019 в 11:52
поделиться

Это не отвечает на вопрос, а просто добавляет дополнительную информацию о Point (местоположение) окна в пределах всех экранов).

Используйте приведенный ниже код, чтобы узнать, находится ли точка (например, последнее известное местоположение окна) в пределах всего Рабочего стола. Если нет, сбросьте Местоположение окна на значение по умолчанию 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;
6
ответ дан 24 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: