Изменить настройки dpi через реестр программно?

Я разработал проект, содержащий несколько форм. Проблема в том, что на широких мониторах он отображается некорректно. Я искал его и обнаружил, что он работает правильно для dpi = 96. Я хочу изменить dpi через реестр в vb.net (не вручную). Вот код, который я использую:

    Dim dpi As Graphics = Me.CreateGraphics
    If (dpi.DpiX <> 96 And dpi.DpiY <> 96) Then
        Dim DPISetting As RegistryKey = My.Computer.Registry.CurrentUser.OpenSubKey("HKEY_CURRENT_USER\Control Panel\Desktop\WindowsMetrics", True)
        DPISetting.SetValue("AppliedDPI", 96) '**
    End If

Но я получаю исключение nullRefrence Exception в строке с **. В экземпляре объекта не задана ссылка на объект. Я действительно работал над этим в течение длительного времени, но не мог найти, в чем проблема. Я был бы так благодарен, если у вас есть какие-либо предложения или решения для этого.


person butterfly    schedule 26.05.2012    source источник
comment
Для вашего приложения кажется оскорбительным изменение системы dpi пользователей для учета проблемы дизайна в вашем приложении.   -  person Jason Sturges    schedule 26.05.2012


Ответы (1)


Эта конструкция в корне неверна.

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

Вместо того, чтобы пытаться заставить ваш хак работать, почему бы просто не решить настоящую проблему? Если ваша форма не отображается правильно при высоких (или низких) настройках DPI, вам нужно заставить ее работать в этих сценариях. Это часть разработки настольных приложений — убедиться, что ваше приложение работает в гетерогенных средах.

С этой целью вы можете найти полезные советы в этих ответах:

person Cody Gray    schedule 26.05.2012
comment
Ну, раньше я чувствовал, что немного странно менять настройки реестра. Я также думал об использовании AutoScaleMode.dpi. Теперь, когда вы предложили, я уверен. Спасибо за полезный совет. - person butterfly; 26.05.2012