C как получить разрешение экрана
Перейти к содержимому

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

Как получить разрешение экрана из приложения c# winform?

Как я могу получить разрешение экрана, на котором работает мое приложение c# Winform?

4 ответов

вам нужна только область, которую будет использовать стандартное приложение, т. е. исключая панель задач Windows и закрепленные окна? Если это так, используйте экран.WorkingArea property. В противном случае, используйте экран.Границы.

Если есть несколько мониторов, вам нужно захватить экран из вашей формы, т. е.

Если вы хотите знать, какой основной экран дисплея, используйте экран.Первичный собственность. Кроме того, вы можете получить список экраны от экран.AllScreens собственность.

данный ответ верен, насколько это возможно. Однако, когда вы установили размер текста более 125%, Windows (и .NET) начинают лгать о размере экрана, чтобы сделать автоматическое масштабирование для вас.

большую часть времени это не проблема — вы обычно хотите, чтобы Windows и .NET это делали. Однако в случае, когда вам действительно, действительно нужно знать фактическое количество пикселей на экране (скажем, вы хотите рисовать непосредственно на рабочем столе DC), вы можете сделать следующий. Я пробовал это только на Win10. YMMV в других версиях Windows.

пока это единственный способ получить истинное количество пикселей экрана, если вы не хотите глобально отключить осведомленность DPI в своем приложении. Обратите внимание, что этот пример получает основной размер дисплея — вам нужно будет изменить это, чтобы получить другие экраны.

используйте класс Screen и опросите границы собственность. Класс Screen имеет статическое свойство для Главный Экран и еще одно статическое свойство, которое возвращает список всех экранов, подключенных к системе.

Console. Window Width Свойство

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Возвращает или задает ширину окна консоли.

Значение свойства

Ширина окна консоли измеряется столбцами.

Исключения

Значение свойства WindowWidth или WindowHeight не больше 0.

Сумма значений свойств WindowHeight и WindowTop больше или равна MaxValue.

Значение свойства WindowWidth или WindowHeight больше максимально возможной ширины или высоты окна для текущего разрешения экрана и шрифта консоли.

Ошибка при чтении или записи данных.

Операция задания вызывается в операционной системе, отличной от Windows.

Примеры

В этом примере демонстрируется SetWindowSize метод и WindowWidth WindowHeight свойства. Необходимо запустить пример, чтобы увидеть полный эффект изменения размера окна консоли.

В примере отображаются размеры окна консоли, равные 85 столбцам и 43 строкам, а затем ожидает нажатия клавиши. При нажатии любой клавиши размеры окна консоли будут сокращены вдвое, отображаются новые измерения, а в примере ожидается еще один нажатие клавиши. Наконец, при нажатии любого ключа окно консоли восстанавливается до исходных размеров и завершается пример.

Комментарии

Попытка задать значение WindowWidth свойства при перенаправлении выходных данных вызывает ArgumentOutOfRangeException исключение или исключение IOException . Чтобы предотвратить исключение, можно задать значение этого свойства только в том случае, если IsOutputRedirected свойство возвращается false .

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

Gray Pipe

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

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

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

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 ( ширина в точках курсора в элементах управления – так написано в справке ) .

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

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 не обойтись?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *