2016-02-05 1 views
3

Я пытаюсь найти способ изменить масштаб отображения в Windows 10 программным путем с помощью C#.Как я могу изменить масштабирование дисплея Windows 10 программно с помощью C#

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

Итак, я был в состоянии отследить, что записи в реестре (HKEY_CURRENT_USER Panel \ Control \ Desktop) устанавливаются, когда пользователь делает это вручную через официальный диалог рассматривается ниже:

Windows 10 Display Scaling Dialog

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

Я знаю, что вы можете использовать PInvoke для изменения разрешения экрана: Setting my Display Resolution

мне было интересно, если есть способ, чтобы изменить это «%» для данного экрана тоже? i.e .. мой экран выше этого говорит 150%, я хотел бы beable, чтобы программно изменить его через весь диапазон 100-500%.

ответ

1

При поиске точно такого же, я нашел ваш вопрос и нашел возможное решение.

Я обнаружил, что для каждого монитора для этого значения% находится в реестре Computer\HKEY_CURRENT_USER\Control Panel\Desktop\PerMonitorSettings\*monitorId*\DpiValue. похоже, что значение значения зависит от экрана (размер и dpi), см. this reddit post.

Для моего 24" 1080ра экрана 0 означает 100% и 1 означает 125%. This Technet Article, кажется,, объясняющие значения немного.

К сожалению, не достаточно, чтобы изменить значение параметра реестра. Но вы можете освежить точек на дюйм при изменении разрешения после записи в реестре.

следующий код устанавливает точек на дюйм, а затем переключает разрешение низкое и обратно высокий, чтобы вызвать обновление точек на дюйм.

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using Microsoft.Win32; 

namespace SetDpiScale 
{ 
    public partial class Form1 : Form 
    { 
     public enum DMDO 
     { 
      DEFAULT = 0, 
      D90 = 1, 
      D180 = 2, 
      D270 = 3 
     } 

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
     struct DEVMODE 
     { 
      public const int DM_PELSWIDTH = 0x80000; 
      public const int DM_PELSHEIGHT = 0x100000; 
      private const int CCHDEVICENAME = 32; 
      private const int CCHFORMNAME = 32; 

      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)] 
      public string dmDeviceName; 
      public short dmSpecVersion; 
      public short dmDriverVersion; 
      public short dmSize; 
      public short dmDriverExtra; 
      public int dmFields; 

      public int dmPositionX; 
      public int dmPositionY; 
      public DMDO dmDisplayOrientation; 
      public int dmDisplayFixedOutput; 

      public short dmColor; 
      public short dmDuplex; 
      public short dmYResolution; 
      public short dmTTOption; 
      public short dmCollate; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)] 
      public string dmFormName; 
      public short dmLogPixels; 
      public int dmBitsPerPel; 
      public int dmPelsWidth; 
      public int dmPelsHeight; 
      public int dmDisplayFlags; 
      public int dmDisplayFrequency; 
      public int dmICMMethod; 
      public int dmICMIntent; 
      public int dmMediaType; 
      public int dmDitherType; 
      public int dmReserved1; 
      public int dmReserved2; 
      public int dmPanningWidth; 
      public int dmPanningHeight; 
     } 

     [DllImport("user32.dll", CharSet = CharSet.Auto)] 
     static extern int ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      ChangeDPI(0); // 100% 
     } 
     private void button2_Click(object sender, EventArgs e) 
     { 
      ChangeDPI(1); // 125% 
     } 

     void ChangeDPI(int dpi) 
     { 
      RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel", true); 

      key = key.OpenSubKey("Desktop", true); 
      key = key.OpenSubKey("PerMonitorSettings", true); 
      key = key.OpenSubKey("*monitor id where to change the dpi*", true); // my second monitor here 

      key.SetValue("DpiValue", dpi); 

      SetResolution(1920, 1080); // this sets the resolution on primary screen 
      SetResolution(2560, 1440); // returning back to my primary screens default resolution 
     } 

     private static void SetResolution(int w, int h) 
     { 
      long RetVal = 0; 

      DEVMODE dm = new DEVMODE(); 

      dm.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE)); 

      dm.dmPelsWidth = w; 
      dm.dmPelsHeight = h; 

      dm.dmFields = DEVMODE.DM_PELSWIDTH | DEVMODE.DM_PELSHEIGHT; 


      RetVal = ChangeDisplaySettings(ref dm, 0); 
     } 
    } 
} 
+0

проблема с го является решением, что я не вижу ни на одном компьютере WinMonitor PeretonSettings в реестре, либо вижу только один монитор. Решение с изменяющимся разрешением не работает с глобальной настройкой LogPixels. –

Смежные вопросы