Habe folgendes problem:
Habe ein Monitor der sich ZOWIE XL LCD nennt.
Aus unerklärlichen Gründen lässt sich die Bildschirmauflösung obwohl das Kompatible ist nicht auf 1920x1080 einstellen.
Dabei spielt es keine Rolle ob 59 Hz, 60 Hz, 100 Hz, 120 Hz, oder 144 Hz einstelle.
Das komische ist ich kann aber alle anderen Auflösungen ändern.
Alles was niedriger ist geht ohne probleme.
1920x1080 geht nicht Fehler unbekannt. Allerdings über QRes.exe und in Windows Board mitteln lässt sich die Auflösung anwenden.
3200x1800 wenn ich 144 Hz läuft ohne probleme.
2560x1440 wenn ich 144 Hz läuft ohne probleme.
3840x2160 wenn ich 120 Hz läuft ohne probleme.
Der Code scheint aber Inordnung zu sein.
Spoiler anzeigen
mfg.
Xiantrius
Habe ein Monitor der sich ZOWIE XL LCD nennt.
Aus unerklärlichen Gründen lässt sich die Bildschirmauflösung obwohl das Kompatible ist nicht auf 1920x1080 einstellen.
Dabei spielt es keine Rolle ob 59 Hz, 60 Hz, 100 Hz, 120 Hz, oder 144 Hz einstelle.
Das komische ist ich kann aber alle anderen Auflösungen ändern.
Alles was niedriger ist geht ohne probleme.
1920x1080 geht nicht Fehler unbekannt. Allerdings über QRes.exe und in Windows Board mitteln lässt sich die Auflösung anwenden.
3200x1800 wenn ich 144 Hz läuft ohne probleme.
2560x1440 wenn ich 144 Hz läuft ohne probleme.
3840x2160 wenn ich 120 Hz läuft ohne probleme.
Der Code scheint aber Inordnung zu sein.
VB.NET-Quellcode
- Module DisplayModul
- <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)>
- Public Structure DEVMODE
- Public Const CCHDEVICENAME As Integer = 32
- Public Const CCHFORMNAME As Integer = 32
- <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.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
- <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)>
- Public dmFormName As String
- Public dmLogPixels As Short
- Public dmBitsPerPel As Integer ' Declared wrong in the full framework
- 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
- Public dmPositionX As Integer ' Using a PointL Struct does not work
- Public dmPositionY 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
- <Runtime.InteropServices.DllImport("user32.dll")>
- Public Function ChangeDisplaySettings(ByRef devMode As DEVMODE, flags As Integer) As Integer
- End Function
- Public Structure ScreenResolution
- Public Property Resolution As Size
- Public Property ColorDeptI As Short
- Public Property ColorDeptS As String
- Public Property 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
- #Region "Public Functions/Subs"
- ''' <summary>Stellt die Bildschrimauflösung.</summary>
- ''' <param name="ResWidth">Neue Monitor X Auflösung als Size</param>
- ''' <param name="ResHeight">Neue Monitor Y Auflösung als Size</param>
- ''' <param name="Bits">Neue Monitor Farbtiefe als Integer</param>
- ''' <param name="Frequenz">Neue Monitor Hz Frequenz als Integer</param>
- #End Region
- Public Sub ChangeResolution(ResWidth As UShort, ResHeight As UShort, Optional ByVal Bits As UShort = Nothing, Optional ByVal Frequenz As UShort = Nothing)
- Dim MonitorScreen As Screen = Screen.PrimaryScreen
- Dim iWidth As UShort = ResWidth
- Dim iHeight As UShort = ResHeight
- Dim iBits As UShort = Bits
- Dim iFrequenz As UShort = Frequenz
- Dim dm As New DEVMODE()
- dm.dmDeviceName = New [String](New Char(31) {})
- dm.dmFormName = New [String](New Char(31) {})
- dm.dmSize = CShort(Runtime.InteropServices.Marshal.SizeOf(dm))
- Dim iRet As Integer
- If Not 0 = EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, dm) Then
- dm.dmPelsWidth = iWidth
- dm.dmPelsHeight = iHeight
- dm.dmBitsPerPel = iBits
- dm.dmDisplayFrequency = iFrequenz
- iRet = ChangeDisplaySettings(dm, CDS_TEST)
- If iRet = DISP_CHANGE_FAILED Then
- MessageBox.Show("Unable to process your request")
- MessageBox.Show("Description: Unable To Process Your Request. Sorry For This Inconvenience.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
- Else
- iRet = ChangeDisplaySettings(dm, CDS_UPDATEREGISTRY)
- Select Case iRet
- Case DISP_CHANGE_SUCCESSFUL
- If True Then
- Exit Select
- End If
- Case DISP_CHANGE_RESTART
- If True Then
- Exit Select
- End If
- Case Else
- If True Then
- Exit Select
- End If
- End Select
- End If
- End If
- ResWidth = Nothing
- ResHeight = Nothing
- MonitorScreen = Nothing
- Bits = Nothing
- Frequenz = Nothing
- iWidth = Nothing
- iHeight = Nothing
- iBits = Nothing
- iFrequenz = Nothing
- dm = Nothing
- dm.dmDeviceName = Nothing
- dm.dmFormName = Nothing
- dm.dmSize = Nothing
- dm.dmPelsWidth = Nothing
- dm.dmPelsHeight = Nothing
- dm.dmBitsPerPel = Nothing
- dm.dmDisplayFrequency = Nothing
- iRet = Nothing
- End Sub
- #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 Module
- Option Explicit On
- Option Strict On
- Class Form1
- Public Auflösungsliste As New SupportedScreenSizes
- Private Sub FilterStringCheck()
- Dim ComboBoxFilter As New ComboBox
- ComboBoxFilter.Items.Clear()
- ComboBoxFilter.Text = ""
- ComboBox1.Items.Clear()
- ComboBox2.Items.Clear()
- ComboBox3.Items.Clear()
- ComboBoxFilter.Items.AddRange(Auflösungsliste.GetSizes)
- For i As Integer = 0 To ComboBoxFilter.Items.Count - 1
- If Not ComboBox1.Items.Contains(ComboBoxFilter.Items.Item(i).ToString) Then
- ComboBox1.Items.Add(ComboBoxFilter.Items.Item(i).ToString)
- End If
- Next
- ComboBox2.Items.AddRange(Auflösungsliste.GetBits)
- ComboBox3.Items.AddRange(Auflösungsliste.GetHertz)
- End Sub
- Dim XResolution As String
- Dim YResolution As String
- Private Sub ResolutionAPI_INTERN()
- If CBool(CInt(ComboBox1.Text <> "") And InStr(ComboBox1.Text, "x")) Then
- XResolution = ComboBox1.Text.Split(CChar("x"))(0)
- YResolution = ComboBox1.Text.Split(CChar("x"))(1)
- End If
- ChangeResolution(CUShort(XResolution), CUShort(YResolution), CUShort(ComboBox2.Text), CUShort(ComboBox3.Text))
- End Sub
- End Class
- 'Aktuelle Bildschirmauflösung auslesen
- Dim nScreenWidth As Integer
- Dim nScreenHeight As Integer
- Dim nWorkingWidth As Integer
- Dim nWorkingHeight As Integer
- 'Aktuelle Farbtiefe auslesen
- Dim hDCScreen As Integer
- Dim lScreenColDepth As UInt32
- Dim FScreen As Integer
- 'Aktuelle Bildschirmwiederholfrequenz auslesen
- Dim nFrequenz As Integer
- 'Aktuelle Bits und Frequenz auslesen
- Private Const BITSPIXEL As Integer = 12
- Private Const FREQUENZ As Integer = 116
- Private Function Display_Informationen(ByVal Info As String) As String
- With Screen.PrimaryScreen.Bounds
- nScreenWidth = .Width
- nScreenHeight = .Height
- End With
- With Screen.PrimaryScreen.WorkingArea
- nWorkingWidth = .Width
- nWorkingHeight = .Height
- End With
- hDCScreen = SupportedScreenSizes.GetDC(0&)
- FScreen = SupportedScreenSizes.GetDC(0&)
- nFrequenz = SupportedScreenSizes.GetDeviceCaps(CType(FScreen, IntPtr), FREQUENZ)
- lScreenColDepth = CUInt(SupportedScreenSizes.GetDeviceCaps(CType(hDCScreen, IntPtr), BITSPIXEL))
- Info = "Gesamt_Auflösung: " & nScreenWidth & "x" & nScreenHeight & ", " & vbNewLine &
- "Arbeitsbereich: " & nWorkingWidth & "x" & nWorkingHeight & ", " & "Farben: " & 2 ^ lScreenColDepth & ", " & vbNewLine &
- "Farbtiefe: " & lScreenColDepth & " Bits, " & "Frequenz: " & nFrequenz & " Hertz"
- Return Info
- End Function
mfg.
Xiantrius