To get it (one of the ways, there are others..) :
Dim hMon As IntPtr = MonitorFromWindow(Me.Handle, MONITOR_DEFAULTTOPRIMARY)
Dim dsf As DEVICE_SCALE_FACTOR
GetScaleFactorForMonitor(hMon, dsf)
MessageBox.Show(String.Format("Scale Factor : {0}", dsf.ToString()), "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
To change it : (nIndex depends on the default scale; for example on my PC, 0 = 100%, 1 = 125%, ...)
Dim nIndex As Integer = 1
SystemParametersInfo(SPI_SETLOGICALDPIOVERRIDE, nIndex, 0, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
With declarations :
<DllImport("Shcore.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Public Shared Function GetScaleFactorForMonitor(hMon As IntPtr, ByRef pScale As DEVICE_SCALE_FACTOR) As HRESULT
End Function
Public Enum DEVICE_SCALE_FACTOR
DEVICE_SCALE_FACTOR_INVALID = 0
SCALE_100_PERCENT = 100
SCALE_120_PERCENT = 120
SCALE_125_PERCENT = 125
SCALE_140_PERCENT = 140
SCALE_150_PERCENT = 150
SCALE_160_PERCENT = 160
SCALE_175_PERCENT = 175
SCALE_180_PERCENT = 180
SCALE_200_PERCENT = 200
SCALE_225_PERCENT = 225
SCALE_250_PERCENT = 250
SCALE_300_PERCENT = 300
SCALE_350_PERCENT = 350
SCALE_400_PERCENT = 400
SCALE_450_PERCENT = 450
SCALE_500_PERCENT = 500
End Enum
<DllImport("User32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Public Shared Function MonitorFromWindow(ByVal hwnd As IntPtr, ByVal dwFlags As Integer) As IntPtr
End Function
<DllImport("User32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
Public Shared Function SystemParametersInfo(uiAction As UInteger, uiParam As Integer, ByRef pvParam As Integer, fWinIni As UInteger) As Boolean
End Function
Public Const SPIF_UPDATEINIFILE As Integer = &H1
Public Const SPIF_SENDWININICHANGE As Integer = &H2
Public Const MONITOR_DEFAULTTONULL As Integer = &H0
Public Const MONITOR_DEFAULTTOPRIMARY As Integer = &H1
Public Const MONITOR_DEFAULTTONEAREST As Integer = &H2
Public Const SPI_GETLOGICALDPIOVERRIDE = &H9E
Public Const SPI_SETLOGICALDPIOVERRIDE = &H9F