Rubrik: System/Windows · Desktop/Bildschirm/Display | VB-Versionen: VB.NET | 11.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: mikeb69 | Bewertung: | Views: 11.592 |
www.powerdesktop-online.de | System: 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