Alle Bildschirmauflösungen ermitteln und wechseln

    • VB.NET

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      Alle Bildschirmauflösungen ermitteln und wechseln

      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

      VB.NET-Quellcode

      1. Imports System
      2. Imports System.RuntimeImports
      3. System.Runtime.InteropServices
      4. Class ClassDisplay
      5. <StructLayout(LayoutKind.Sequential)> _
      6. Public Structure DEVMODE
      7. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
      8. Public dmDeviceName As String
      9. Public dmSpecVersion As Short
      10. Public dmDriverVersion As Short
      11. Public dmSize As Short
      12. Public dmDriverExtra As Short
      13. Public dmFields As Integer
      14. Public dmOrientation As Short
      15. Public dmPaperSize As Short
      16. Public dmPaperLength As Short
      17. Public dmPaperWidth As Short
      18. Public dmScale As Short
      19. Public dmCopies As Short
      20. Public dmDefaultSource As Short
      21. Public dmPrintQuality As Short
      22. Public dmColor As Short
      23. Public dmDuplex As Short
      24. Public dmYResolution As Short
      25. Public dmTTOption As Short
      26. Public dmCollate As Short
      27. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
      28. Public dmFormName As String
      29. Public dmLogPixels As Short
      30. Public dmBitsPerPel As Short
      31. Public dmPelsWidth As Integer
      32. Public dmPelsHeight As Integer
      33. Public dmDisplayFlags As Integer
      34. Public dmDisplayFrequency As Integer
      35. Public dmICMMethod As Integer
      36. Public dmICMIntent As Integer
      37. Public dmMediaType As Integer
      38. Public dmDitherType As Integer
      39. Public dmReserved1 As Integer
      40. Public dmReserved2 As Integer
      41. Public dmPanningWidth As Integer
      42. Public dmPanningHeight As Integer
      43. End Structure
      44. Private Declare Function EnumDisplaySettings Lib "user32.dll" Alias "EnumDisplaySettingsA" _
      45. (ByVal deviceName As String, ByVal modeNum As Integer, _ ByRef devMode As DEVMODE) As Integer
      46. Private Declare Function ChangeDisplaySettingsEx Lib "user32.dll" Alias "ChangeDisplaySettingsExA" _
      47. (ByVal lpszDeviceName As String, _ ByRef lpDevMode As DEVMODE, ByVal hwnd As Int32, _
      48. ByVal dwflags As Int32, ByVal lParam As Int32) As Int32
      49. 'Struktur die die Bildschirmauflösung beschreibt
      50. Public Structure ScreenResolution
      51. Public Resolution As Size
      52. Public ColorDeptI As Integer
      53. Public ColorDeptS As String
      54. Public Total As String
      55. End Structure
      56. Private ScreenRes As New List(Of ScreenResolution)
      57. Private deviceName As String 'dies kann ab .net 2 einfacher mit Screen.PrimaryScreen.Bounds abfegragt werden
      58. Private Const ENUM_CURRENT_SETTINGS As Integer = -1
      59. Private Const CDS_UPDATEREGISTRY As Integer = 1 'entgültige umstellung der auflösung
      60. Private Const CDS_TEST As Integer = 2 'umstellung der auflösung testen
      61. Private Const DISP_CHANGE_SUCCESSFUL As Integer = 0
      62. Private Const DISP_CHANGE_RESTART As Integer = 1
      63. Private Const DISP_CHANGE_FAILED As Integer = -1
      64. Private Const DM_BITSPERPEL = &H40000
      65. Private Const DM_PELSWIDTH = &H80000
      66. Private Const DM_PELSHEIGHT = &H100000
      67. Private Const DM_DISPLAYFREQUENCY = &H400000
      68. ''' <summary>Sub New der ClassDisplay</summary>
      69. ''' <param name="devName">DeviceName des gewählten Bildschirmes.</param>
      70. Public Sub New(ByVal devName As String)
      71. deviceName = devName
      72. Dim dm As New DEVMODE()
      73. dm.dmDeviceName = New String(New Char(31) {})
      74. dm.dmFormName = New String(New Char(31) {})
      75. dm.dmSize = CShort(Marshal.SizeOf(dm))
      76. Dim counter As Integer = 0
      77. Do
      78. '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
      79. If EnumDisplaySettings(deviceName, counter, dm) <> 0 Then ' Farbtiefe
      80. Dim Colors As String
      81. Select Case dm.dmBitsPerPel
      82. Case 4
      83. Colors = "16 Farben"
      84. Case 8
      85. Colors = "256 Farben"
      86. Case 16
      87. Colors = "HighColor"
      88. Case 24
      89. Colors = "24-Bit"
      90. Case 32
      91. Colors = "TrueColor"
      92. Case Else
      93. 'was eigentlich nicht sein darf
      94. Colors = "Keine Farbtiefe gefunden !!!"
      95. End Select
      96. 'liste füllen
      97. Dim sr As New ScreenResolution
      98. sr.ColorDeptI = dm.dmBitsPerPel
      99. sr.ColorDeptS = Colors
      100. sr.Resolution = New Size(dm.dmPelsWidth, dm.dmPelsHeight)
      101. sr.Total = dm.dmPelsWidth & " x " & dm.dmPelsHeight & " " & Colors ScreenRes.Add(sr)
      102. sr = Nothing
      103. counter += 1
      104. Else
      105. Exit Do
      106. End If
      107. Loop
      108. End Sub
      109. #Region "Public Functions/Subs"
      110. ''' <summary>Stellt die Bildschrimauflösung.</summary>
      111. ''' <param name="res">Neue Auflösung als Size</param>
      112. ''' <param name="colorDept">Neue Farbtiefe als Integer</param>
      113. ''' <returns>True wenn die Umstellung erfolgreich war sonst False</returns>
      114. Public Function ChangeRes(ByVal res As Size, ByVal colorDept As Integer) As Boolean
      115. 'Struktur für die Übergabe vorbereiten
      116. Dim dm As New DEVMODE
      117. dm.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL Or DM_DISPLAYFREQUENCY
      118. dm.dmPelsHeight = res.Height
      119. dm.dmPelsWidth = res.Width
      120. dm.dmBitsPerPel = colorDept
      121. dm.dmDeviceName = New String(New Char(31) {})
      122. dm.dmFormName = New String(New Char(31) {})
      123. dm.dmSize = CShort(Marshal.SizeOf(dm))
      124. 'Auflösung umstellen
      125. Dim ret As Integer = ChangeDisplaySettingsEx(deviceName, dm, 0&, CDS_UPDATEREGISTRY, 0&)
      126. Select Case ret
      127. Case DISP_CHANGE_FAILED
      128. MessageBox.Show("Die Auflösung konnte nicht verändert werden !!!")
      129. Return False
      130. Case DISP_CHANGE_SUCCESSFUL
      131. Return True
      132. Case DISP_CHANGE_RESTART
      133. MessageBox.Show("Zur Umstellung der Auflösung muss das System neu gebootet werden.")
      134. Return True
      135. Case Else
      136. Return False
      137. End Select
      138. dm = Nothing
      139. Return True
      140. End Function
      141. #End Region
      142. #Region "Properties"
      143. ''' <summary>Gibt eine Liste mit allen möglichen Bildschrimauflösungen zurück.</summary>
      144. ''' <returns>Bildschirmauflösungen List(Of ScreenResolution)</returns>
      145. Public ReadOnly Property ScreenResolutions() As List(Of ScreenResolution)
      146. Get
      147. Return ScreenRes
      148. End Get
      149. End Property
      150. #End Region
      151. End Class


      Gruss

      mikeb69

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mikeb69“ () aus folgendem Grund: Code Formatierung bearbeitet

      thx.

      Ich hab jetzt eine kl. SampleSolution gebastelt, die euch natürlich auch nicht erspart bleibt ;).

      Dazu 2 kl Änderungen:
      1. die Daten als Property designed, sodaß Databinding unterstützt wird

        VB.NET-Quellcode

        1. 'struktur die die bildschirmauflösung beschreibt
        2. Public Structure ScreenResolution
        3. Public Property Resolution As Size
        4. Public Property ColorDeptI As Short
        5. Public Property ColorDeptS As String
        6. Public Property Total As String
        7. End Structure


      2. bei der ChangeResolution-Methode das ColorDept-Argument auf Short geändert, weil Option Strict On! meckert richtigerweise an, dass ein Integer kein Short ist:

        VB.NET-Quellcode

        1. Public Function ChangeRes(ByVal res As Size, ByVal colorDept As Short) As Boolean


      Jo, und dann ein kl. Form, was alle verfügbaren Auflösungen anzeigt, und man kann eine davon anwenden. (Zum Schließen wirds dann wieder rückgängig gemacht.)

      VB.NET-Quellcode

      1. Imports System.IO
      2. Imports ScreenResolutions.ClassDisplay
      3. Public Class frmScreenResolutions
      4. Dim displ As ClassDisplay
      5. Dim _Orig As ScreenResolution 'zur Wiederherstellung der Orig-Einstellung
      6. Private Sub frmScreenResolutions_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
      7. displ = New ClassDisplay(Screen.PrimaryScreen.DeviceName)
      8. Me.ClassDisplay_ScreenResolutionBindingSource.DataSource = displ.ScreenResolutions
      9. _Orig = displ.ScreenResolutions(0)
      10. End Sub
      11. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
      12. Dim curr = DirectCast(ClassDisplay_ScreenResolutionBindingSource.Current, ScreenResolution)
      13. displ.ChangeRes(curr.Resolution, curr.ColorDeptI)
      14. End Sub
      15. Private Sub frmScreenResolutions_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles Me.FormClosed
      16. displ.ChangeRes(_Orig.Resolution, _Orig.ColorDeptI)
      17. End Sub
      18. End Class
      Dateien