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

Проблемы с PrimaryScreen.Size

В течение некоторого времени я был в порядке с Screen.PrimaryScreen.Bounds.Size, но на моем компьютере с Windows7, подключенным к моему телевизору с большим экраном, он дал мне неправильные значения.

Я читал в другом месте, чтобы попробовать SystemInformation.PrimaryMonitorSize, но это дает те же значения.

Когда я нажимаю правой кнопкой мыши на рабочем столе, чтобы получить разрешение экрана, он говорит 1920x1080. Вышеуказанные два дают мне 1280x720.

Я также пробовал версии WPF:

var w = System.Windows.SystemParameters.PrimaryScreenWidth;
var h = System.Windows.SystemParameters.PrimaryScreenHeight;
MessageBox.Show(new Size((int)w, (int)h).ToString());

Размер экрана был изменен с помощью (щелкните правой кнопкой мыши на рабочем столе) Personalize > Desktop, чтобы быть на 150% (так как экран 60 дюймов, и вы сидите далеко от него).

Как определить это, чтобы можно было изменить значение, возвращаемое из вышеперечисленного?

Примечание. Я обнаружил, как обойти это с помощью щелчка правой кнопкой мыши и настроить совместимость, чтобы отключить виртуализацию DPI, но мне все еще нужно программное решение, поэтому мне не нужно пользователь самостоятельно отрегулирует это: см. http://msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx#dpi_virtualization

4b9b3361

Ответ 1

Я не чувствую, что это дублированный вопрос, но ответ такой же, как и в другом потоке: fooobar.com/questions/95978/... Поскольку вопрос не о размытости шрифты, но почему Screen.PrimaryScreen.Bounds.Size возвращает неверную информацию. Это может помочь другим.

Я столкнулся с сообщением об ошибке, так что mscorlib сбросил нулевую ошибку. Из этой нити http://forums.asp.net/t/1653876.aspx/1 Я смог обнаружить, что снятие флажка "Включить параметры безопасности ClickOnce" исправило это. Это похоже на взлом, но он работает.

Ответ 2

Это может быть ваш параметр Dpi в окнах, установленных выше 100%

Попробуйте использовать этот метод, это уменьшит разрешение до текущих настроек системы Dpi

Winforms:

private Size GetDpiSafeResolution()
{
    using (Graphics graphics = this.CreateGraphics())
    {
        return new Size((Screen.PrimaryScreen.Bounds.Width * (int)graphics.DpiX) / 96
          , (Screen.PrimaryScreen.Bounds.Height * (int)graphics.DpiY) / 96);
    }
}

WPF:

private Size GetDpiSafeResolution()
{
    PresentationSource _presentationSource = PresentationSource.FromVisual(Application.Current.MainWindow);
    Matrix matix = _presentationSource.CompositionTarget.TransformToDevice;
    return new Size(SystemParameters.PrimaryScreenHeight * matix.M11, SystemParameters.PrimaryScreenWidth * matix.M22);
}

Примечание. Перед запуском этого кода убедитесь, что ваш MainWindow загружен.