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 Dieser Tipp wurde bereits 11.832 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats November 2024 Dieter Otter WAVE-Dateien aufnehmen Ein Code-Ausschnitt, mit dem sich WAVE-Dateien in verschiedenen Aufnahmequalitäten aufnehmen lassen. Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. |
||||||||||||||||
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. |