vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: System/Windows · Desktop/Bildschirm/Display   |   VB-Versionen: VB.NET11.10.07
Ermitteln aller möglichen Auflösungen II (.NET)

Ermitteln aller möglichen Auflösungen und Umstellen der Auflösung mittels Code unter Berücksichtigung mehrerer angeschlossener Bildschirme

Autor:   mikeb69Bewertung:  Views:  11.592 
www.powerdesktop-online.deSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Vor einiger Zeit haben wir Ihnen einen Tipp vorgestellt, mit dem sich die möglichen Bildschirmauflösungen ermitteln bzw. auf eine bestimmte Auflösung umstellen lässt. Das Ganze funktionierte jedoch nur für den Betrieb mit einem Monitor:  Ermitteln aller möglichen Auflösungen

Was aber, wenn die Auflösung für den 2. Monitor ermittelt oder umgestellt werden soll?

Ab sofort auch kein Problem mehr. Die Klasse ClassDisplay wurde nun dahingehend erweitert, dass Sie beim Instanzieren den gewünschten Monitor angeben können, für den Sie die Auflösungen ermitteln bzw. umstellen möchten.

Modifiziertes Klassenmodul

' ClassDisplay Klasse für Bildschirminformationen und Aktionen
' 02.09.2007 Erstellung
' 09.10.2007 Zweiter/externer Bildschirm aufgenommen
 
Imports System
Imports System.Runtime
Imports System.Runtime.InteropServices
 
Class ClassDisplay
 
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure DEVMODE
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    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
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public dmFormName As String
    Public dmLogPixels As Short
    Public dmBitsPerPel As Short
    Public dmPelsWidth As Integer
    Public dmPelsHeight As Integer
 
    Public dmDisplayFlags As Integer
    Public dmDisplayFrequency As Integer
 
    Public dmICMMethod As Integer
    Public dmICMIntent As Integer
    Public dmMediaType As Integer
    Public dmDitherType As Integer
    Public dmReserved1 As Integer
    Public dmReserved2 As Integer
 
    Public dmPanningWidth As Integer
    Public dmPanningHeight As Integer
  End Structure
 
  Private Declare Function EnumDisplaySettings Lib "user32.dll" _
    Alias "EnumDisplaySettingsA" ( _
    ByVal deviceName As String, _
    ByVal modeNum As Integer, _
    ByRef devMode As DEVMODE) As Integer
 
  Private Declare Function ChangeDisplaySettingsEx Lib "user32.dll" _
    Alias "ChangeDisplaySettingsExA" ( _
    ByVal lpszDeviceName As String, _
    ByRef lpDevMode As DEVMODE, _
    ByVal hwnd As Int32, _
    ByVal dwflags As Int32, _
    ByVal lParam As Int32) As Int32
 
  ' Struktur, die die Bildschirmauflösung beschreibt
  Public Structure ScreenResolution
    Public Resolution As Size
    Public ColorDeptI As Integer
    Public ColorDeptS As String
    Public Total As String
  End Structure
 
  Private ScreenRes As New List(Of ScreenResolution)
  Private deviceName As String
 
  ' dies kann ab .NET 2 einfacher mit 
  ' Screen.PrimaryScreen.Bounds abfegragt werden 
  Private Const ENUM_CURRENT_SETTINGS As Integer = -1
 
  ' entgültige Umstellung der Auflösung
  Private Const CDS_UPDATEREGISTRY As Integer = 1
 
  ' Umstellung der Auflösung testen
  Private Const CDS_TEST As Integer = 2
 
  Private Const DISP_CHANGE_SUCCESSFUL As Integer = 0
  Private Const DISP_CHANGE_RESTART As Integer = 1
  Private Const DISP_CHANGE_FAILED As Integer = -1
 
  Private Const DM_BITSPERPEL = &H40000
  Private Const DM_PELSWIDTH = &H80000
  Private Const DM_PELSHEIGHT = &H100000
  Private Const DM_DISPLAYFREQUENCY = &H400000
 
  ''' <summary>Sub New der ClassDisplay</summary>
  ''' <param name="devName">DeviceName des gewählten Bildschirmes.</param>
  Public Sub New(ByVal devName As String)
    deviceName = devName
    Dim dm As New DEVMODE()
    dm.dmDeviceName = New String(New Char(31) {})
    dm.dmFormName = New String(New Char(31) {})
    dm.dmSize = CShort(Marshal.SizeOf(dm))
 
    Dim counter As Integer = 0
    Do
      ' Durch Hochzählen des Counter werden alle Auflösungen ermittelt, 
      ' bis 0 zurückgegeben wird.
      ' Wenn counter als -1 (ENUM_CURRENT_SETTINGS) übergeben wird, 
      ' wird die aktuelle Auflösung ermittelt
      If EnumDisplaySettings(deviceName, counter, dm) <> 0 Then
        ' Farbtiefe
        Dim Colors As String
        Select Case dm.dmBitsPerPel
          Case 4
            Colors = "16 Farben"
          Case 8
            Colors = "256 Farben"
          Case 16
            Colors = "HighColor"
          Case 24
            Colors = "24-Bit"
          Case 32
            Colors = "TrueColor"
          Case Else
            ' was eigentlich nicht sein darf
            Colors = "Keine Farbtiefe gefunden !!!"
        End Select
 
        ' Liste füllen
        Dim sr As New ScreenResolution
        sr.ColorDeptI = dm.dmBitsPerPel
        sr.ColorDeptS = Colors
        sr.Resolution = New Size(dm.dmPelsWidth, dm.dmPelsHeight)
        sr.Total = dm.dmPelsWidth & " x " & dm.dmPelsHeight & " " & Colors
        ScreenRes.Add(sr)
        sr = Nothing
        counter += 1
      Else
        Exit Do
      End If
    Loop
  End Sub
 
#Region "Public Functions/Subs"
  ''' <summary>Stellt die Bildschrimauflösung um.</summary>
  ''' <param name="res">Neue Auflösung als Size</param>
  ''' <param name="colorDept">Neue Farbtiefe als Integer</param>
  ''' <returns>True wenn die Umstellung erfolgreich war sonst False</returns>
  Public Function ChangeRes(ByVal res As Size, ByVal colorDept As Integer) As Boolean
 
    ' Struktur für die Übergabe vorbereiten
    Dim dm As New DEVMODE
    dm.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or _
      DM_BITSPERPEL Or DM_DISPLAYFREQUENCY
    dm.dmPelsHeight = res.Height
    dm.dmPelsWidth = res.Width
    dm.dmBitsPerPel = colorDept
    dm.dmDeviceName = New String(New Char(31) {})
    dm.dmFormName = New String(New Char(31) {})
    dm.dmSize = CShort(Marshal.SizeOf(dm))
 
    ' Auflösung umstellen
    Dim ret As Integer = ChangeDisplaySettingsEx(deviceName, dm, _
      0&, CDS_UPDATEREGISTRY, 0&)
    Select Case ret
      Case DISP_CHANGE_FAILED
        MessageBox.Show("Die Auflösung konnte nicht verändert werden !!!")
        Return False
      Case DISP_CHANGE_SUCCESSFUL
        Return True
      Case DISP_CHANGE_RESTART
        MessageBox.Show("Zur Umstellung der Auflösung muss " & _
          "das System neu gebootet werden.")
        Return True
      Case Else
        Return False
    End Select
    dm = Nothing
    Return True
  End Function
#End Region
 
#Region "Properties"
  ''' <summary>Gibt eine Liste mit allen möglichen 
  ''' Bildschrimauflösungen zurück.</summary>
  ''' <returns>Bildschirmauflösungen List(Of ScreenResolution)</returns>
  Public ReadOnly Property ScreenResolutions() As List(Of ScreenResolution)
    Get
      Return ScreenRes
    End Get
  End Property
#End Region
 
End Class

Um nun die Auflösungen für den 1. Bildschirm zu ermitteln oder neu festzulegen rufen Sie die ClassDisplay-Klasse wie folgt auf:

Dim cd As New ClassDisplay(Screen.PrimaryScreen.DeviceName)
 
' alle Auflösungen anzeigen
For i As Integer = 0 To cd.ScreenResolutions.Count - 1
  ListBox1.Items.Add(cd.ScreenResolutions(i).Total)
Next 

Sind mehrere Monitore angeschlossen, kann die Auflösung für einen bestimmten Monitor wie folgt ermittelt oder geändert werden:

' 2. Monitor (falls vorhanden)
If Screen.AllScreens.Length > 1 Then
  ' alle Auflösungen des 2. Monitor ermitteln
  ' hierzu die ClassDisplay-Klasse mit dem DeviceName des 
  ' 2. Monitors instanzieren
  Dim cd As New ClassDisplay(Screen.AllScreens(1).DeviceName
  For i As Integer = 0 To cd.ScreenResolutions.Count - 1
    ListBox1.Items.Add(cd.ScreenResolutions(i).Total)
  Next 
End If



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.