Hallo,
diesen Tipp hab ich 2007 auf meiner alten Homepage veröffentlicht.
Da es die Seite nicht mehr gibt, setz ich ihn jetzt hier rein.
Manchmal muss für die Darstellung des eigenen Programmes, die Bildschirmauflösung verändert werden. Damit der User das nicht selbst machen muss, brauchen wir eine Funktion die dies erledigt.
Dafür gibt es die beiden API's EnumDisplaySettings zur Ermittlung aller möglichen Auflösungen und ChangeDisplaySettings bzw. ChangeDisplaySettingsEx zur Umstellung der Auflösung.
Entscheidend für Ermittlung der Auflösung ist ein korrekter Aufbau der devMode Structure.
Wenn Sie Probleme beim Ermitteln der Auflösungen oder beim Umstellen auf eine andere Auflösung haben, wird Ihr Problem wahrscheinlich in der devMode Structure liegen !!!
Hier nun meine Klasse
Gruss
mikeb69
diesen Tipp hab ich 2007 auf meiner alten Homepage veröffentlicht.
Da es die Seite nicht mehr gibt, setz ich ihn jetzt hier rein.
Manchmal muss für die Darstellung des eigenen Programmes, die Bildschirmauflösung verändert werden. Damit der User das nicht selbst machen muss, brauchen wir eine Funktion die dies erledigt.
Dafür gibt es die beiden API's EnumDisplaySettings zur Ermittlung aller möglichen Auflösungen und ChangeDisplaySettings bzw. ChangeDisplaySettingsEx zur Umstellung der Auflösung.
Entscheidend für Ermittlung der Auflösung ist ein korrekter Aufbau der devMode Structure.
Wenn Sie Probleme beim Ermitteln der Auflösungen oder beim Umstellen auf eine andere Auflösung haben, wird Ihr Problem wahrscheinlich in der devMode Structure liegen !!!
Hier nun meine Klasse
VB.NET-Quellcode
- Imports System
- Imports System.RuntimeImports
- 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
- Private Const CDS_UPDATEREGISTRY As Integer = 1 'entgültige umstellung der auflösung
- Private Const CDS_TEST As Integer = 2 'umstellung der auflösung testen
- 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.</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
Gruss
mikeb69
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mikeb69“ () aus folgendem Grund: Code Formatierung bearbeitet