C как получить разрешение экрана

от admin

Получение и установка разрешения экрана

Как я могу собрать и изменить разрешение экрана с помощью Visual C #?

задан 22 фев ’11, 16:02

Bruce Powell III

@Justin: Добавьте SystemInformation.PrimaryMonitorSize в микс и опубликуйте его в качестве ответа. — Tedd Hansen

7 ответы

Если вы при получении разрешение экрана, вы захотите использовать System.Windows.Forms.Screen класс. В Screen.AllScreens свойство можно использовать для доступа к коллекции всех дисплеев в системе, или вы можете использовать Screen.PrimaryScreen свойство для доступа к основному дисплею.

Компания Screen класс имеет свойство, называемое Bounds , который можно использовать для определения разрешения текущего экземпляра класса. Например, чтобы определить разрешение текущего экрана:

Если вы изменения разрешение, все становится немного сложнее. Эта статья (или вот этот) предоставляет подробную реализацию и объяснение. Надеюсь это поможет.

Спасибо. Это действительно просто. С помощью этой команды можно использовать свойства Resolution.Height и Resolution.Width. — Умут Д.

Есть ли способ сделать это не с помощью winforms? IE, что-то, что будет работать с ядром .net? — Александр Райан Баггетт

Мне нужно разрешение экрана для захвата экрана рабочего стола. После того, как Zoomin не работает, он возвращает увеличенное разрешение, поэтому изображение также масштабировалось любым методом для реального экрана в Zoomin Window. — Ahmad

В C # вот как получить разрешение экрана:

нажатие кнопки или загрузка формы:

ответ дан 27 дек ’15, 07:12

Этот код будет отлично работать в WPF. Вы можете использовать его либо при загрузке страницы, либо при нажатии кнопки.

ответ дан 04 авг.

Спасибо, что поделились беспроигрышными формами! — Лерой

в Winforms есть класс Screen, который можно использовать для получения данных о размерах экрана и глубине цвета для всех дисплеев, подключенных к компьютеру. Вот страница документации: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.aspx

ИЗМЕНИТЬ разрешение экрана сложнее. Существует сторонний класс Resolution, который обертывает собственный код, который вы в противном случае подключили бы. Используйте его вложенный класс CResolution, чтобы установить разрешение экрана на новую высоту и ширину; но имейте в виду, что это будет работать только для комбинаций высоты / ширины, которые фактически поддерживает дисплей (800×600, 1024×768 и т. д., а не 817×435).

How to retrieve the Screen Resolution from a C# winform app?

How can I retrieve the screen resolution that my C# Winform App is running on?

5 Answers 5

Do you need just the area a standard application would use, i.e. excluding the Windows taskbar and docked windows? If so, use the Screen.WorkingArea property. Otherwise, use Screen.Bounds.

If there are multiple monitors, you need to grab the screen from your form, i.e.

If you want to know which is the primary display screen, use the Screen.Primary property. Also, you can get a list of screens from the Screen.AllScreens property.

The given answer is correct, as far as it goes. However, when you have set your Text size to anything more than 125%, Windows (and .NET) start to fib about the size of the screen in order to do auto-scaling for you.

Most of the time, this is not an issue — you generally want Windows and .NET to do this. However, in the case where you really, truly need to know the actual count of pixels on the screen (say, you want to paint directly to the desktop DC), you can do the following. I’ve only tried this on Win10. YMMV on other Windows versions.

So far, this is the only way I’ve found to get true screen pixel count if you don’t want to globally turn off DPI awareness in your app. Note that this example gets the Primary display size — you will need to modify this to get other screens.

Get and Set Screen Resolution

How can I collect and change screen resolution using Visual C#?

8 Answers 8

For retrieving the screen resolution, you’re going to want to use the System.Windows.Forms.Screen class. The Screen.AllScreens property can be used to access a collection of all of the displays on the system, or you can use the Screen.PrimaryScreen property to access the primary display.

The Screen class has a property called Bounds , which you can use to determine the resolution of the current instance of the class. For example, to determine the resolution of the current screen:

For changing the resolution, things get a little more complicated. This article (or this one) provides a detailed implementation and explanation.

C как получить разрешение экрана

Спрашивающий

Общие обсуждения

Казалось бы все просто:

double h = SystemParameters.PrimaryScreenHeight;

double w = SystemParameters.PrimaryScreenWidth;

У меня ноубук (Windows 8). При установленном в настройках разрешении экрана монитора 1920 на 1080 получаем h = 864.0, а w = 1536.0. То есть, в 1.25 раза меньше, чем ожидалось. Настольный ПК (WindowsXP) показывает h и w как в установленном разрешении. Возникает вопрос, как определить это отношение:

SystemParameters.PrimaryScreenHeight, SystemParameters.PrimaryScreenWidth и установленное в настройках разрешение экрана. Как точно узнать этот коэффициент (1.0 или 1.25).

  • Изменен тип Maksim Marinov Microsoft contingent staff, Moderator 26 сентября 2013 г. 6:40

Все ответы

Вопрос снимаю. Ответ, кажется, найден. Это — SystemParameters .CaretWidth ( ширина в точках курсора в элементах управления – так написано в справке ) .

Читать:
Как изменить vid pid устройства

Установленное в настройках разрешение экрана равно

SystemParameters .PrimaryScreenWidth/SystemParameters.CaretWidth по ширине и SystemParameters .PrimaryScreenHeight/SystemParameters.CaretWidth по высоте.

У меня, по крайней мере, работает…

Все-таки мне нужен ответ. Может быть, ширина каретки в некоторых случаях подойдет, но все же, как программно определить установленное пользователем разрешение экрана?

SystemParameters .PrimaryScreenWidth и SystemParameters .PrimaryScreenHeight показывают действительное (реальное) разрешение экрана. Например, пользователь на своем устройстве установил разрешение 1920 на 1080, а действительное разрешение устройства при этом будет 1536 на 864 (PrimaryScreenWidth и PrimaryScreenHeight). То есть, такое случается, если CaretWidth=0.8 на этом устройстве (экране). И 1920 * 0.8 = 1536, 1080 * 0.8 = 864. Все бы хорошо, но я не уверен, что ширина каретки (CaretWidth) всегда корректно покажет это соотношение. В приложении необходимо иногда перемещать один объект относительно другого, определяя координаты последнего с помощью метода Point PointToScreen(Point point) класса Visual. И не зная этой величины (0.8) на разных устройствах (настольный ПК, ноутбук, планшет) под Windows 8 не возможно корректно перемещать объекты по экрану. Прошу помочь мне решить эту проблему.

Хотя, может быть и:

Предыдущее вроде выкидывает таскбар.

WorkArea. явно не разрешение экрана, которое установил пользователь на своем устройстве. А вот второй вариант (с VirtualScreenHeight) — похоже. Сейчас нет под рукой ноутбука, где ширина каретки 0.8. Через час смогу практически проверить.

Нет, не правильно . SystemParameters .VirtualScreenHeight и SystemParameters .VirtualScreenWidth показывают тоже самое, что и SystemParameters .PrimaryScreenHeight и SystemParameters .PrimaryScreenWidth. Может ли быть так, что ширина каретки всегда равна ширине точки экрана (например, у меня в ноутбуке 0.8 пикселя)? Уверенности нет. В MSDN ничего не нашел.

  • Изменено yura_ 11 сентября 2013 г. 15:34

Решил все-таки продолжить тему. Так как не совсем уверен в найденном мной решении.

У меня в приложении WPF имеется проблема при работе на устройствах, где физическое разрешение экрана в пикселях не соответствует установленному пользователем разрешению. Например, на новых ноутбуках Asys N 550 J рекомендованное производителем разрешение экрана 1920 на 1080 ( FulHD ) на самом деле (физически) означает разрешение 1536 на 864. Соответственно и все остальные допустимые в настройках разрешения экрана физически в 0,8 раза меньше, чем указано в настройках. То есть точка разрешения экрана равна 0,8 пикселя?

В приложении WPF можно определить только разрешение экрана действительное, в пикселях. То есть, в моем случае, при установленном разрешении экрана 1920 на 1080:

SystemParameters .PrimaryScreenWidth = 1536

SystemParameters .PrimaryScreenHeight = 864;

Была большая надежда на VirtualScreenWidth и VirtualScreenHeight , но и эти свойства класса SystemParameters показывают то же самое.

Иногда в приложении WPF приходиться устанавливать размер картинки. Например, если предполагается, что пользователь использует для работы с приложением разрешение экрана 1024 на 768 и установить размер картинки в XAML Width ="1024" или в коде C # Myimage . Width = 1024, то картинка не поместится на экране, так как этот размер устанавливается в пикселях. А приложение будет выведено в окне размером 819 пикселей на 614,4. Такие же проблемы появляются, если надо разместить в приложении одну картинку (или control ) относительно другой в определенном месте. Положение на экране первой картинки (или контрола) myImage , размещенного в контейнере (например, Grid ) определяю так:

Point p = MyWindow.myImage. PointToScreen(pt).

Точка p показывает смещение верхнего левого угла myimage в точках разрешения (на моем устройстве одна точка 0.8 пикселя). А когда вы хотите сместить в вычисленное положение другую картинку, myImage 2. Left = p.X, то Left считается уже в пикселях. И на моем ноутбуке это выглядит совсем не так, как нужно.

Может следует делать так:

Сначала определить смещение картинки в текущих координатах (в точках разрешение экрана)

Point pt = new Point ();

Point p = MyWindow.myimage.PointToScreen(pt);

А затем определить это смещение относительно окна (экрана) в пикселях

Point pf = app.acyWindow.PointFromScreen(p);

myImage 2. Left = pf.X;

Не знаю. Но с лучайно я заметил, что свойство CaretWidth (ширина каретки) класса SystemParameters как раз равна размеру точки разрешения экрана в пикселях. В моем случает эта величина составляет 0,8. Это действительно «случайно» или и на других устройствах будет точно так же (и всегда в дальнейшем), мне не известно.

Но, в связи с этим случаем, можно смещать картинку 2 так:

Point p = MyWindow . myimage . PointToScreen ( pt );

myImage2.Left = p.X * SystemParameters .CaretWidth;

Эти два способа не равнозначны и дают незначительную разницу в несколько пикселей. О причинах могу только догадываться…

В то же время, приложения, написанные 5-10 лет назад в Visual C++ 6.0 на Win 32 работают отлично при любом разрешении экрана. Все масштабируется достаточно корректно и таких проблем не возникает.

Может нужно тогда воспользоваться функциями win 32?

[ return : MarshalAs ( UnmanagedType .Bool)]

public static extern Boolean EnumDisplaySettings([ param : MarshalAs ( UnmanagedType .LPTStr)] string lpszDeviceName, [ param : MarshalAs ( UnmanagedType .U4)] int iModeNum,

[ In , Out ] ref DEVMODE lpDevMode);

DEVMODE mode = new DEVMODE ();

mode.dmSize = ( ushort ) Marshal .SizeOf(mode);

EnumDisplaySettings( null , ENUM_CURRENT_SETTINGS, ref mode);

И тогда уже размеры точки разрешения экрана:

double widthPoint = SystemParameters .PrimaryScreenWidth / (double)mode.dmPelsWidth

double heighthPoint = SystemParameters .PrimaryScreenHeight/ (double)mode.dmPelsHeight;

Не считаю себя достаточно компетентным, поэтому прошу совета. Неужели без старого доброго Win 32 не обойтись?

Похожие статьи