Snippet

Změna rozlišení obrazovky

Přidáno: 12.8.2010       Kategorie: Aplikace       Autor: Ondřej Linhart

Změnit rozlišení obrazovky je možné pouze pomocí Windows API. Pokud máte více monitorů, proběhne změna rozlišení primárního monitoru (pokud není nastaveno klonování obrazu na oba monitory).

'Deklarace:
Public Module UnsafeNativeMethods
  Public Const CCDEVICENAME As Integer = 32
  Public Const CCFORMNAME As Integer = 32
  Public Const CDS_UPDATEREGISTRY As Integer = &H1
  Public Const CDS_TEST As Long = &H2
  Public Const DISP_CHANGE_FAILED As Integer = -1
  Public Const DISP_CHANGE_RESTART As Integer = 1
  Public Const DISP_CHANGE_SUCCESSFUL As Integer = 0
  Public Const ENUM_CURRENT_SETTINGS As Integer = -1
  <StructLayout(LayoutKind.Sequential)> Public Structure DEVMODE
    <MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> Public dmDeviceName As String
    Public dmSpecVersion As Short
    Public dmDriverVersion As Short
    Public dmSize As Short
    Public dmDriverExtra As Short
    Public dmFields As Integer
    Public dmOrientation As Short
    Public dmPaperSize As Short
    Public dmPaperLength As Short
    Public dmPaperWidth As Short
    Public dmScale As Short
    Public dmCopies As Short
    Public dmDefaultSource As Short
    Public dmPrintQuality As Short
    Public dmColor As Short
    Public dmDuplex As Short
    Public dmYResolution As Short
    Public dmTTOption As Short
    Public dmCollate As Short
    <MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)> Public dmFormName As String
    Public dmUnusedPadding As Short
    Public dmBitsPerPel As Short
    Public dmPelsWidth As Integer
    Public dmPelsHeight As Integer
    Public dmDisplayFlags As Integer
    Public dmDisplayFrequency As Integer
  End Structure
  <DllImport("user32")> _
  Public Function EnumDisplaySettings(ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
  End Function
  <DllImport("user32")> _
  Public Function ChangeDisplaySettings(ByRef DEVMODE As DEVMODE, ByVal flags As Integer) As Integer
  End Function
  Public Function ChangeResolution(ByVal width As Integer, ByVal height As Integer) As Integer
    Dim devMode As DEVMODE
    With devMode
      .dmDeviceName = New [String](New Char(32) {})
      .dmFormName = New [String](New Char(32) {})
      .dmSize = CShort(Marshal.SizeOf(GetType(DEVMODE)))
      If EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, devMode) <> 0 Then
        .dmPelsWidth = width
        .dmPelsHeight = height
        Dim lResult As Integer
        lResult = ChangeDisplaySettings(devMode, CDS_TEST)
        If lResult = DISP_CHANGE_FAILED Then
          Return lResult
        End If
        lResult = ChangeDisplaySettings(devMode, CDS_UPDATEREGISTRY)
        Return lResult
      End If
    End With
  End Function
End Module


'Použití:
Imports System.Runtime.InteropServices
Module Module1
  Sub Main()
    Select Case ChangeResolution(1024, 768)
      Case DISP_CHANGE_FAILED
        'Při pokusu o změnu rozlišení došlo k chybě.
      Case DISP_CHANGE_RESTART
        'Změna rozlišení vyžaduje restart.
      Case DISP_CHANGE_SUCCESSFUL
        'Změna rozlišení proběhla úspěšně
    End Select
  End Sub
End Module 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.