kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Timwi
Timwi
Вопрос

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

Как узнать размер всего рабочего стола? Не "рабочая область" и не "разрешение экрана", оба из которых относятся только к одному экрану. Я хочу узнать общую ширину и высоту виртуального рабочего стола, часть которого отображается на каждом мониторе.

74 2009-08-22T22:41:15+00:00 9
Roman Starkov
Roman Starkov
Редактировал вопрос 30-го ноября 2009 в 7:06
Программирование
screen
screen-resolution
.net
c#
desktop
Решение / Ответ
 Dennis
Dennis
8-го ноября 2011 в 5:53
2011-11-08T17:53:24+00:00
Дополнительно
Источник
Редактировать
#9399410

У вас есть два варианта:

  1. PresentationFramework.dll

Объект systemparameters.VirtualScreenWidth Объект systemparameters.VirtualScreenHeight

  1. System.Windows.Forms.dll

Системы сведения.VirtualScreen.Ширина Системы сведения.VirtualScreen.Высота

Используйте первый вариант если вы разрабатываете приложения WPF.

125
0
P Daddy
P Daddy
22-го августа 2009 в 10:55
2009-08-22T22:55:41+00:00
Дополнительно
Источник
Редактировать
#9399407

Я думаю, что пришло время обновить этот ответ с помощью 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);
P Daddy
P Daddy
Редактировал ответ 27-го марта 2016 в 2:29
28
0
chris LB
chris LB
7-го марта 2011 в 9:17
2011-03-07T09:17:07+00:00
Дополнительно
Источник
Редактировать
#9399409

Проверьте:

SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height
Kirk Woll
Kirk Woll
Редактировал ответ 25-го мая 2011 в 7:02
16
0
 TechStuffBC
TechStuffBC
29-го июля 2010 в 6:35
2010-07-29T18:35:55+00:00
Дополнительно
Источник
Редактировать
#9399408

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

Используйте приведенный ниже код, чтобы узнать, находится ли точка (например, последнее известное местоположение окна) в границах всего Рабочего стола. Если нет, сбросьте местоположение окна на значение по умолчанию 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;
Kirk Woll
Kirk Woll
Редактировал ответ 6-го ноября 2015 в 12:24
6
0
 Andreas
Andreas
27-го апреля 2017 в 11:28
2017-04-27T11:28:31+00:00
Дополнительно
Источник
Редактировать
#9399414

Чтобы получить физический размер пикселя монитора, вы можете использовать это.

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);
    }

}
6
0
JD  - DC TECH
JD - DC TECH
16-го января 2015 в 3:43
2015-01-16T15:43:05+00:00
Дополнительно
Источник
Редактировать
#9399411

Вы можете использовать границы системы.Рисунок`.

Вы можете создать функцию, как это

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;

С помощью этого кода Вы получите все свойства, как ширина, высота и т. д.

 Irshad
Irshad
Редактировал ответ 19-го апреля 2016 в 9:51
1
0
 dynamichael
dynamichael
11-го февраля 2016 в 5:37
2016-02-11T05:37:20+00:00
Дополнительно
Источник
Редактировать
#9399412

Этот метод возвращает прямоугольник, который содержит все экраны' границы, используя самые низкие значения, для левой и верхней, и высшими ценностями для правой и нижней...

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);
}
 dynamichael
dynamichael
Редактировал ответ 14-го марта 2017 в 2:44
1
0
 core.tweaks
core.tweaks
10-го декабря 2016 в 5:28
2016-12-10T17:28:07+00:00
Дополнительно
Источник
Редактировать
#9399413

Я думаю, что лучший способ попасть в "Реал" и экран-размер, чтобы получить значения прямо из видео-контроллер.


    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);
                }
            }
        }
}

Это должно сделать работу ;) Привет ...

 core.tweaks
core.tweaks
Редактировал ответ 10-го декабря 2016 в 8:10
1
0
Konstantin S.
Konstantin S.
20-го ноября 2018 в 11:57
2018-11-20T11:57:48+00:00
Дополнительно
Источник
Редактировать
#9399415

Получить размер виртуальный дисплей без каких-либо зависимостей

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);
}
0
0
Похожие сообщества 16
DotNetRuChat
DotNetRuChat
6 652 пользователей
Чат русскоязычного .NET сообщества http://dotnet.ru/ Правила: https://t.me/DotNetRuChat/704399 Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia, @DotNetRuJobs, @uwp_ru Флуд в @dotnettalks
Открыть telegram
Вакансии .NET
Вакансии .NET
3 530 пользователей
Правила: https://t.me/DotNetRuJobs/123 Канал с вакансиями - https://t.me/DotNetRuJobsFeed Вам могут быть интересны: @dotnetruchat, @cilchat, @fsharp_chat, @pro_net, @AvaloniaRU, @xamarin_russia Флуд в @dotnettalks
Открыть telegram
Microsoft Stack Jobs
Microsoft Stack Jobs
2 414 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 330 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
pro.net
pro.net
1 820 пользователей
Обсуждение .NET и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). https://t.me/pro_net/34653 Флудилка: @dotnettalks
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 772 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией