Подтвердить что ты не робот

Проблема с разрешением экрана в WPF?

Я собираюсь определить разрешение с помощью следующего кода в WPF:

double height = System.Windows.SystemParameters.PrimaryScreenHeight;
double width = System.Windows.SystemParameters.PrimaryScreenWidth;

Текущее разрешение моего экрана - 1920 * 1200, но height - 960.0, а width - 1536.0!!!

Что с ним не так?
Спасибо заранее.

4b9b3361

Ответ 1

Имейте в виду, что все местоположения и размеры WPF являются плавающей точкой с единицей 1/96 дюйма. Не пиксели. Это делает разрешение вашего окна независимым. Выполнение математики: высота = 960/96 = 10 дюймов. Если ваш видеоадаптер установлен на 120 DPI (120/96 = 125%): 10 * 120 = 1200 пикселей. То же самое для ширины: 1536/96 * 120 = 1920 пикселей.

System.Windows.Forms работает в единицах пикселей. Вы получаете меньше, чем 1050 для высоты, потому что она вычитает высоту панели задач. Но для WPF вы всегда хотите работать с 1/96 ", никогда не пикселями.

Ответ 2

Для еще более надежной реализации вам необходимо рассчитать коэффициенты DPI в вашей системе и работать с этими факторами. Нормальное значение DPI равно 96, но некоторые мониторы могут иметь разные значения. Учтите, что ваш код может работать на мониторе с другим значением DPI, чем 96. Рассмотрим этот код:

    private static void CalculateDpiFactors()
    {
        Window MainWindow = Application.Current.MainWindow;
        PresentationSource MainWindowPresentationSource = PresentationSource.FromVisual(MainWindow);
        Matrix m = MainWindowPresentationSource.CompositionTarget.TransformToDevice;
        thisDpiWidthFactor = m.M11;
        thisDpiHeightFactor = m.M22;
    }

Затем вы можете использовать эти коэффициенты для получения окончательных значений:

CalculateDpiFactors();
double ScreenHeight = SystemParameters.PrimaryScreenHeight * thisDpiHeightFactor;
double ScreenWidth = SystemParameters.PrimaryScreenWidth * thisDpiWidthFactor;

Значения ScreenHeight и ScreenWidth должны соответствовать тому, что вы видите в окне свойств вашего монитора.

Ответ 3

Попробуйте SystemParameters.FullPrimaryScreenWidth и FullPrimaryScreenHeight, я считаю, что PrimaryScreenWidth и Height возвращают размер доступного окна клиента после удаления панели задач и других настольных диапазонов на вашем экран.

Ответ 4

Пожалуйста, вызовите это после загрузки Windows.

 public static class Ext
{
    public static Size GetNativePrimaryScreenSize(this Window window)
    {
        PresentationSource mainWindowPresentationSource = PresentationSource.FromVisual(window);
        Matrix m = mainWindowPresentationSource.CompositionTarget.TransformToDevice;
        var dpiWidthFactor = m.M11;
        var dpiHeightFactor = m.M22;
        double screenHeight = SystemParameters.PrimaryScreenHeight * dpiHeightFactor;
        double screenWidth = SystemParameters.PrimaryScreenWidth * dpiWidthFactor;

        return new Size(screenWidth, screenHeight);
    }
}

Ответ 6

Если вы установите флажок "Использовать масштабирование DPI в стиле Windows XP", возвращается верное значение "Screen.PrimaryScreen.Bounds". Если нет, возвращаемое значение пропорционально сокращается значением DPI (которое является значением по умолчанию).

Чтобы установить флажок "Использовать масштабирование DPI в стиле Windows XP", разверните флажок "Чтобы сделать текст и элементы на экране более четкими в программах, которые не предназначены для высокого уровня DPI" в следующей ссылке: http://windows.microsoft.com/en-us/windows-vista/Make-the-text-on-your-screen-larger-or-smaller

Ответ 7

Вы можете использовать это:

float dpiX, dpiY;
using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero))
{
     dpiX = graphics.DpiX;
     dpiY = graphics.DpiY;
}

double screenX = SystemParameters.PrimaryScreenWidth / 96 * dpiX;
double screenY = SystemParameters.PrimaryScreenHeight / 96 * dpiY;

Ответ 8

попробуйте эти.. я считаю, что это может исправить ошибку.....

System.Windows.Form1.Screen.PrimaryScreen.Bounds.Height; System.Windows.Form1.Screen.PrimaryScreen.Bounds.Widtht;