eigener Code für Bildschirmauflösung ändern & externe Prozess HWND

  • VB.NET

Es gibt 88 Antworten in diesem Thema. Der letzte Beitrag () ist von Xiantrius.

    eigener Code für Bildschirmauflösung ändern & externe Prozess HWND

    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

    VB.NET-Quellcode

    1. Module DisplayModul
    2. <Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)>
    3. Public Structure DEVMODE
    4. Public Const CCHDEVICENAME As Integer = 32
    5. Public Const CCHFORMNAME As Integer = 32
    6. <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)>
    7. Public dmDeviceName As String
    8. Public dmSpecVersion As Short
    9. Public dmDriverVersion As Short
    10. Public dmSize As Short
    11. Public dmDriverExtra As Short
    12. Public dmFields As Integer
    13. Public dmOrientation As Short
    14. Public dmPaperSize As Short
    15. Public dmPaperLength As Short
    16. Public dmPaperWidth As Short
    17. Public dmScale As Short
    18. Public dmCopies As Short
    19. Public dmDefaultSource As Short
    20. Public dmPrintQuality As Short
    21. Public dmColor As Short
    22. Public dmDuplex As Short
    23. Public dmYResolution As Short
    24. Public dmTTOption As Short
    25. Public dmCollate As Short
    26. <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)>
    27. Public dmFormName As String
    28. Public dmLogPixels As Short
    29. Public dmBitsPerPel As Integer ' Declared wrong in the full framework
    30. Public dmPelsWidth As Integer
    31. Public dmPelsHeight As Integer
    32. Public dmDisplayFlags As Integer
    33. Public dmDisplayFrequency As Integer
    34. Public dmICMMethod As Integer
    35. Public dmICMIntent As Integer
    36. Public dmMediaType As Integer
    37. Public dmDitherType As Integer
    38. Public dmReserved1 As Integer
    39. Public dmReserved2 As Integer
    40. Public dmPanningWidth As Integer
    41. Public dmPanningHeight As Integer
    42. Public dmPositionX As Integer ' Using a PointL Struct does not work
    43. Public dmPositionY As Integer
    44. End Structure
    45. Private Declare Function EnumDisplaySettings Lib "user32.dll" Alias "EnumDisplaySettingsA" _
    46. (ByVal deviceName As String, ByVal modeNum As Integer,
    47. ByRef devMode As DEVMODE) As Integer
    48. <Runtime.InteropServices.DllImport("user32.dll")>
    49. Public Function ChangeDisplaySettings(ByRef devMode As DEVMODE, flags As Integer) As Integer
    50. End Function
    51. Public Structure ScreenResolution
    52. Public Property Resolution As Size
    53. Public Property ColorDeptI As Short
    54. Public Property ColorDeptS As String
    55. Public Property Total As String
    56. End Structure
    57. Private ScreenRes As New List(Of ScreenResolution)
    58. Private deviceName As String 'dies kann ab .net 2 einfacher mit Screen.PrimaryScreen.Bounds abfegragt werden
    59. Private Const ENUM_CURRENT_SETTINGS As Integer = -1
    60. Private Const CDS_UPDATEREGISTRY As Integer = 1 'entgültige umstellung der auflösung
    61. Private Const CDS_TEST As Integer = 2 'umstellung der auflösung testen
    62. Private Const DISP_CHANGE_SUCCESSFUL As Integer = 0
    63. Private Const DISP_CHANGE_RESTART As Integer = 1
    64. Private Const DISP_CHANGE_FAILED As Integer = -1
    65. Private Const DM_BITSPERPEL = &H40000
    66. Private Const DM_PELSWIDTH = &H80000
    67. Private Const DM_PELSHEIGHT = &H100000
    68. Private Const DM_DISPLAYFREQUENCY = &H400000
    69. #Region "Public Functions/Subs"
    70. ''' <summary>Stellt die Bildschrimauflösung.</summary>
    71. ''' <param name="ResWidth">Neue Monitor X Auflösung als Size</param>
    72. ''' <param name="ResHeight">Neue Monitor Y Auflösung als Size</param>
    73. ''' <param name="Bits">Neue Monitor Farbtiefe als Integer</param>
    74. ''' <param name="Frequenz">Neue Monitor Hz Frequenz als Integer</param>
    75. #End Region
    76. Public Sub ChangeResolution(ResWidth As UShort, ResHeight As UShort, Optional ByVal Bits As UShort = Nothing, Optional ByVal Frequenz As UShort = Nothing)
    77. Dim MonitorScreen As Screen = Screen.PrimaryScreen
    78. Dim iWidth As UShort = ResWidth
    79. Dim iHeight As UShort = ResHeight
    80. Dim iBits As UShort = Bits
    81. Dim iFrequenz As UShort = Frequenz
    82. Dim dm As New DEVMODE()
    83. dm.dmDeviceName = New [String](New Char(31) {})
    84. dm.dmFormName = New [String](New Char(31) {})
    85. dm.dmSize = CShort(Runtime.InteropServices.Marshal.SizeOf(dm))
    86. Dim iRet As Integer
    87. If Not 0 = EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, dm) Then
    88. dm.dmPelsWidth = iWidth
    89. dm.dmPelsHeight = iHeight
    90. dm.dmBitsPerPel = iBits
    91. dm.dmDisplayFrequency = iFrequenz
    92. iRet = ChangeDisplaySettings(dm, CDS_TEST)
    93. If iRet = DISP_CHANGE_FAILED Then
    94. MessageBox.Show("Unable to process your request")
    95. MessageBox.Show("Description: Unable To Process Your Request. Sorry For This Inconvenience.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
    96. Else
    97. iRet = ChangeDisplaySettings(dm, CDS_UPDATEREGISTRY)
    98. Select Case iRet
    99. Case DISP_CHANGE_SUCCESSFUL
    100. If True Then
    101. Exit Select
    102. End If
    103. Case DISP_CHANGE_RESTART
    104. If True Then
    105. Exit Select
    106. End If
    107. Case Else
    108. If True Then
    109. Exit Select
    110. End If
    111. End Select
    112. End If
    113. End If
    114. ResWidth = Nothing
    115. ResHeight = Nothing
    116. MonitorScreen = Nothing
    117. Bits = Nothing
    118. Frequenz = Nothing
    119. iWidth = Nothing
    120. iHeight = Nothing
    121. iBits = Nothing
    122. iFrequenz = Nothing
    123. dm = Nothing
    124. dm.dmDeviceName = Nothing
    125. dm.dmFormName = Nothing
    126. dm.dmSize = Nothing
    127. dm.dmPelsWidth = Nothing
    128. dm.dmPelsHeight = Nothing
    129. dm.dmBitsPerPel = Nothing
    130. dm.dmDisplayFrequency = Nothing
    131. iRet = Nothing
    132. End Sub
    133. #Region "Properties"
    134. ''' <summary>Gibt eine Liste mit allen möglichen Bildschrimauflösungen zurück.</summary>
    135. ''' <returns>Bildschirmauflösungen List(Of ScreenResolution)</returns>
    136. Public ReadOnly Property ScreenResolutions() As List(Of ScreenResolution)
    137. Get
    138. Return ScreenRes
    139. End Get
    140. End Property
    141. #End Region
    142. End Module
    143. Option Explicit On
    144. Option Strict On
    145. Class Form1
    146. Public Auflösungsliste As New SupportedScreenSizes
    147. Private Sub FilterStringCheck()
    148. Dim ComboBoxFilter As New ComboBox
    149. ComboBoxFilter.Items.Clear()
    150. ComboBoxFilter.Text = ""
    151. ComboBox1.Items.Clear()
    152. ComboBox2.Items.Clear()
    153. ComboBox3.Items.Clear()
    154. ComboBoxFilter.Items.AddRange(Auflösungsliste.GetSizes)
    155. For i As Integer = 0 To ComboBoxFilter.Items.Count - 1
    156. If Not ComboBox1.Items.Contains(ComboBoxFilter.Items.Item(i).ToString) Then
    157. ComboBox1.Items.Add(ComboBoxFilter.Items.Item(i).ToString)
    158. End If
    159. Next
    160. ComboBox2.Items.AddRange(Auflösungsliste.GetBits)
    161. ComboBox3.Items.AddRange(Auflösungsliste.GetHertz)
    162. End Sub
    163. Dim XResolution As String
    164. Dim YResolution As String
    165. Private Sub ResolutionAPI_INTERN()
    166. If CBool(CInt(ComboBox1.Text <> "") And InStr(ComboBox1.Text, "x")) Then
    167. XResolution = ComboBox1.Text.Split(CChar("x"))(0)
    168. YResolution = ComboBox1.Text.Split(CChar("x"))(1)
    169. End If
    170. ChangeResolution(CUShort(XResolution), CUShort(YResolution), CUShort(ComboBox2.Text), CUShort(ComboBox3.Text))
    171. End Sub
    172. End Class
    173. 'Aktuelle Bildschirmauflösung auslesen
    174. Dim nScreenWidth As Integer
    175. Dim nScreenHeight As Integer
    176. Dim nWorkingWidth As Integer
    177. Dim nWorkingHeight As Integer
    178. 'Aktuelle Farbtiefe auslesen
    179. Dim hDCScreen As Integer
    180. Dim lScreenColDepth As UInt32
    181. Dim FScreen As Integer
    182. 'Aktuelle Bildschirmwiederholfrequenz auslesen
    183. Dim nFrequenz As Integer
    184. 'Aktuelle Bits und Frequenz auslesen
    185. Private Const BITSPIXEL As Integer = 12
    186. Private Const FREQUENZ As Integer = 116
    187. Private Function Display_Informationen(ByVal Info As String) As String
    188. With Screen.PrimaryScreen.Bounds
    189. nScreenWidth = .Width
    190. nScreenHeight = .Height
    191. End With
    192. With Screen.PrimaryScreen.WorkingArea
    193. nWorkingWidth = .Width
    194. nWorkingHeight = .Height
    195. End With
    196. hDCScreen = SupportedScreenSizes.GetDC(0&)
    197. FScreen = SupportedScreenSizes.GetDC(0&)
    198. nFrequenz = SupportedScreenSizes.GetDeviceCaps(CType(FScreen, IntPtr), FREQUENZ)
    199. lScreenColDepth = CUInt(SupportedScreenSizes.GetDeviceCaps(CType(hDCScreen, IntPtr), BITSPIXEL))
    200. Info = "Gesamt_Auflösung: " & nScreenWidth & "x" & nScreenHeight & ", " & vbNewLine &
    201. "Arbeitsbereich: " & nWorkingWidth & "x" & nWorkingHeight & ", " & "Farben: " & 2 ^ lScreenColDepth & ", " & vbNewLine &
    202. "Farbtiefe: " & lScreenColDepth & " Bits, " & "Frequenz: " & nFrequenz & " Hertz"
    203. Return Info
    204. End Function



    mfg.
    Xiantrius
    Will das ohne QRes.exe haben.
    Bitte wenn jemand das problem wie ich hatte und das problem lösen konnte ohne externe Datei in My.resources zu verwenden, wäre ich echt sehr dankbar.
    Moin,

    Ich verweise mal auf einen Forum Eintrag, den man so auch in der Suchmaschine findet.
    vb-paradise.de/index.php/Threa…?postID=759900#post759900
    Vielleicht hilft es dir, ansonsten verstehe ich nicht warum du nicht bei Qres.exe bleibst, wenn es doch funktioniert (abgesehen von DEINEM Wunsch etwas in den RAM auszulagern und von dort auszuführen - denn du kannst es ja einfach zur Laufzeit in einen Temp Ordner schreiben und nach Nutzung wieder löschen.)
    Gibt es keine möglichkeit das über die API zu beheben?
    Ja ursprünglich wollte ich das über RAM machen. Will das ohne QRes.exe machen.
    Mache das ja nur weil das zurzeit der einzige Weg ist zur überbrücken.
    Die exe nutzt mein Programm ja nur wenn es auf die Auflösung 1920x1080 umgeschaltet wird. Amsonsten geht das fast nur mit der API funktion.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xiantrius“ ()

    Das passiert wenn ich mit QRes 1920x1080 machen will.
    Der rest geht ohne QRes.exe.



    Das passiert wenn ich ohne QRes.exe 1920x1080 machen will.
    Der rest geht ohne zicken.



    Hat da jemand eine Lösung? Hoffe ich konnte es bildlich besser Zeigen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Xiantrius“ ()

    Wenn ich die restlichen tausend Foreneinträge im Netz richtig verstanden habe wirst du nicht ohne Qres.exe auskommen. Aus Microsoft erfindlichen Gründen kannst du das mit Board Mitteln nicht aushebeln, sonst könntest du es auch einfach über die Auflösung einstellen.
    Der einzige Weg den ich noch vorschlagen könnte wäre, dass du versuchst herauszufinden was qres.exe oder die anderen Tools machen, also Quellcode. Soweit ich weiß wurde qres.exe in C++ geschrieben so wie auch alle anderen Tools.
    Sorry

    ThomasG82 schrieb:

    Wenn ich die restlichen tausend Foreneinträge im Netz richtig verstanden habe wirst du nicht ohne Qres.exe auskommen. Aus Microsoft erfindlichen Gründen kannst du das mit Board Mitteln nicht aushebeln, sonst könntest du es auch einfach über die Auflösung einstellen.
    Der einzige Weg den ich noch vorschlagen könnte wäre, dass du versuchst herauszufinden was qres.exe oder die anderen Tools machen, also Quellcode. Soweit ich weiß wurde qres.exe in C++ geschrieben so wie auch alle anderen Tools.
    Sorry


    Normal wäre das keine schlechte idee, doch leider hab ich schon mit C# probleme wie soll ich das dann bei C++ machen?
    Kann es dennoch versuchen.
    Meinst du Windows Board Mittel? Wenn ja muss ich dir wiedersprechen. Ich kann über die Anzeigeeinstellung in Kontextmenü über Desktop die Auflösung ohne probleme auf 1920x1080 stellen. Das Kuriose dabei ist, dass die auflösung sogar von Windows Empfohlen wird.
    Wenn nein meinst du bestimmt die API...
    kann das vielleicht an mein Monitor liegen das die API damit nicht 100% klar kommt?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xiantrius“ ()

    Monitorbezeichnung auf Windows ist ZOWIE XL LCD
    Der rest steht auf den Foto.


    Werde sie nochmal hier mit rein schreiben da das Bild bisl unscharf geworden ist.
    Model ID: XL2411-B Type XL2411P
    Rating: 100-240V~,50/60Hz, 1.50A
    Mfg. Date: November 2020
    Rev.: 00-127-BA
    P / N: 9H.LGGPLB.QPE
    S / N: ETFBL02391SL0

    Warum da nur 50/60 Hz da steht ist mir ein Rätsel.
    Tatsächlich kann er:
    59, 60, 100, 120 und 144hz maximal.

    Hab auch schon getestet wegen HDMI und Port eingang.
    Die Auflösung 1920x1080 kann die API nicht ausführen.

    mfg.
    Xiantrius

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xiantrius“ ()

    Xiantrius schrieb:


    Warum da nur 50/60 Hz da steht ist mir ein Rätsel.

    Das hat nichts mit der Auflösung zu tun, da geht es um den Strom Input zur Stromversorgung deines Gerätes das steht auf fast allen deiner elektronischen Geräte drauf.

    Ich schaue auch mal ob ich den Fehler finde
    Also wie erwartet komme ich mit C++ nicht klar. Bin mehr auf VB.NET etwa spezialisiert.
    Konnte den Fehler immer noch nicht finden. Das kann doch nicht sein das die API nicht bei jeden gängigen Monitor kompatibel ist. Vor allem verstehe ich nicht warum das auf Windows Board mitteln reibungslos funktioniert, will ich es ohne QRes.exe ausführen über mein Tool, kommt er mit dieser einen Auflösung die ich einstellen will einfach nicht klar.
    Der Monitor kam irgendwan in Jahre 2016 auf den Markt.
    Habe selbst Windows 10.
    Grafikkarte Radeon RX 590.
    @ThomasG82
    Hast du den Fehler finden können?
    Sorry da kann ich dir leider nicht helfen. Ich komme auch bei aller Recherche zu dem Punkt, dass es nicht funktionieren wird. Warum und woran es genau liegt kann keiner identifizieren. Es raten auch alle überall, für solche Fälle, zu qres.exe oder ähnlichen Tools.
    Hast du mal nur 60hz versucht ohne QRes?

    Denn wie du schreibst hast du ja den Monitor wohl per HDMI angeschlossen und da steht: "Mit HDMI sind maximal nur 60Hz möglich"
    Eventuell schaltet Windows direkt auf 60Hz bei der Umstellung auf 1920x1080 und in deinen Screenshots seh ich immer nur 144Hz was ja nicht geht eigentlich
    hast du kontrolliert ob dein Monitor nach dem Einsatz von Qres nur mit 60Hz läuft?

    Häng mal bitte ein bereinigtest Projekt an bitte so das wir das selbst mal kompilieren können und schauen ob eventuell das Phänomen nachstellbar ist.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    ThomasG82 schrieb:

    Sorry da kann ich dir leider nicht helfen. Ich komme auch bei aller Recherche zu dem Punkt, dass es nicht funktionieren wird. Warum und woran es genau liegt kann keiner identifizieren. Es raten auch alle überall, für solche Fälle, zu qres.exe oder ähnlichen Tools.


    Habe ich auch schon gelesen. Dachte ja vielleicht ob es mitlerweile eine Lösung gibt bzw. das Microsoft das problem behandelt.

    xChRoNiKx schrieb:

    Hast du mal nur 60hz versucht ohne QRes?

    Denn wie du schreibst hast du ja den Monitor wohl per HDMI angeschlossen und da steht: "Mit HDMI sind maximal nur 60Hz möglich"
    Eventuell schaltet Windows direkt auf 60Hz bei der Umstellung auf 1920x1080 und in deinen Screenshots seh ich immer nur 144Hz was ja nicht geht eigentlich
    hast du kontrolliert ob dein Monitor nach dem Einsatz von Qres nur mit 60Hz läuft?

    Häng mal bitte ein bereinigtest Projekt an bitte so das wir das selbst mal kompilieren können und schauen ob eventuell das Phänomen nachstellbar ist.


    Die Auflösung 1920x1080 lässt sich OHNE QRes.exe nicht ändern egal welche Hz-Frequenz ich anwende.
    Ich nutze derzeit Port Anschluss und habe auch nochmal HDMI versucht, aber das Ergebnis war leider das selbe.
    Ich bevorzuge Port, weil es da noch mehr Auswahl der Auflösungen gibt und Schneller als HDMI ist.
    1920x1080 wenn ich 59, 60, 100, 120, 144 versuche kommt immer der gleiche Fehler das es nicht angewendet werden kann.
    Habe auch schon Msgbox(errortostring) versucht die Message war Leer. Leider wird nirgends angezeigt warum der die Auflösung ohne Ausweichmöglichkeit einer externen Datei die mit sowas zu tun hat nicht funktioniert.

    2560x1440 wenn ich 144 Hz läuft ohne probleme.
    3200x1800 wenn ich 144 Hz läuft ohne probleme.
    3840x2160 wenn ich 120 Hz läuft ohne probleme.

    Offenbar müssen wir davon Ausgehen es könnte am Monitortreiber, und/oder an der API von Microsoft liegen das ein Monitor wie meiner nicht 100% unterstützt wird.
    Ich wüsste zu gerne wie der Komplette C++ Code aussieht damit ich es mal damit testen kann da C++ ja mächtiger als VB.NET Code ist. Das wäre mal intersant zu wissen das als eigenes Projekt zu prüfen.
    Wenn sich jemand mit C++ auskennt, wäre ich echt dankbar.

    Amsonsten wäre die Frage ob man das auch ohne API hinbekommt?
    Aber ich glaube das wäre wenn dann aufwendiger, da man vermutlich den Vorgang alles selber schreiben müsste und da muss ich zugeben bin ich in der Materie ziemlich am Limit und müsste meine Kenntnisse mit VB.NET noch weiter ausdehnen.

    Vielleicht gibt es eine ähnliche API die das mit der Auflösung ändern bewerkstelligen können?

    VB.NET-Quellcode

    1. <Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="EnumDisplaySettingsA")>
    2. Private Function EnumDisplaySettings(ByVal deviceName As String, ByVal modeNum As Integer, ByRef devMode As DEVMODE) As Integer
    3. End Function
    4. <Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="ChangeDisplaySettingsA")>
    5. Public Function ChangeDisplaySettings(ByRef devMode As DEVMODE, flags As Integer) As Integer
    6. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Xiantrius“ ()

    Fakiz schrieb:

    Löse doch mal bitte diese Zeile auf: ChangeResolution(CUShort(XResolution), CUShort(YResolution), CUShort(ComboBox2.Text), CUShort(ComboBox3.Text))
    Mit wieviel bits arbeitest du denn?


    hi @Fakiz
    In übrigen hab ich das verbessert.
    Die funktion zwingt einen nicht die Bits-Farbtiefe zu ändern und Hz-Frequenz zu verändern.
    Habe Windows 10 kann nur 32 Bit auf den Desktop. Selbst dann wenn ich den Standard Grafiktreiber von Microsoft drauf hätte.
    Ich habe ein recht aktuellen Radeon RX 590 Treiber, auch der Bildschirmtreiber ist aktuell.

    VB.NET-Quellcode

    1. ChangeResolution(Display As Short, ResWidth As UShort, ResHeight As UShort, Optional ByVal Bits As UShort = Nothing, Optional ByVal Frequenz As UShort = Nothing)


    Aber wenn jemand Windows 7 oder weniger hätte könnte er eine andere Farbtiefe nutzen, falls es unterstützt wird.
    Bei Windows 8 weis ich es nicht da ich es noch nie drauf habe und bei Windows 11 eben so wenig. Gehe aber Stark davon aus das sich die Farbtiefe auch nicht auf den Desktop runter drehen lässt.

    Willst du irgendwas andeuten? Alle bis auf eine Auflösungen funktionieren Tadellos. Keiner weis woran das liegt, ich denke das ich nicht alleine das problem habe. Ohne zu wissen warum.
    Vermute ich stark das die API mit den Monitortreiber, oder sogar Monitor selbst nicht so klar kommt.
    QRes.exe geht das hab ich in mein Tool eingebaut damit es fehlgeschlagene Auflösungen die in übrigen mit keiner Hz-Frequenz funktioniert versucht mit der externen Datei über Parameter zu ändern, der Rest geht über mein Programmcode.
    Naja das problem steht ja bereits da.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Xiantrius“ ()

    @Xiantrius Ich denke @Fakiz meint ob Du dein Programm als AnyCPU, x64 oder x32 erstellst. Weil da wird es schon unterschiede geben bezüglich der APIs und der Structure DEVMODE.

    Schau doch einfach mal mit einem HEX-Editor in die qres.exe und schau welche APIs qres.exe verwendet. Ok, hab ich mal für Dich gemacht. Siehe Screenshot. Im Prinzip nutzt qres.exe die gleichen APIs + ein paar andere wie Du auch. Vllt machen ja genau die anderen APIs den Unterschied zwischen Deinem Code, wo es nicht funktioniert, und der qres.exe, wo es funktioniert. An der Stelle könnte man vllt. anfangen zu recherchieren was diese APIs im Zusammenhang mit der Änderung der Auflösung zu tun haben könnten. Ich bin mir sogar ziemlich sicher das es auf Github irgendwelche Clone (Nachbauten von qres.exe) inkl. Sourcecode gibt. So um 2005 wurde qres.exe sogar Opensource. Leider ist die Seite wo der Sourcecode veröffentlicht wurde auch schon lange offline und die WaybackMachine hat leider die ZIP mit dem Sourcecode auch nicht gesichert. Vllt liegt sie ja noch irgendwo anders im Internet. Man muss halt das Internet gründlich danach durchforsten und vllt findet sich ja noch ein Link wo die ZIP mit dem Sourcecode rumliegt.

    Nun könnte ich noch einen Schritt weitergehen, wo ich weis welche APIs qres.exe verwendet, und genau diese APIs durch die Software "API Monitor" überwachen lassen. Man sieht dann ganz gut welche API, in welcher Reihenfolge, welche Parameter, welche Werte enthalten/gesetzt wurden usw usw. Aber die Arbeit übernehme ich hier nicht und ich werde auch nicht erklären wo es den "API Monitor" zum Download gibt (kann ja jeder selber danach suchen und nein, es ist kein Hackertool und das gibt es ganz offiziell im Internet und ist sogar Freeware) und wie man damit arbeitet. Ich sag nur. Doku lesen.
    Bilder
    • qres_apis.png

      64,43 kB, 670×712, 45 mal angesehen
    Mfg -Franky-
    Willst du irgendwas andeuten?

    Mich hat die Zeile dm.dmBitsPerPel = iBits etwas verdutzt, aber wenn du sicher bist das du mit 32bits arbeitest dann passt das ja. Überarbeite deine Swicht Case und füge bzw. überarbeite die Fälle.

    C#-Quellcode

    1. int result = ChangeDisplaySettings(ref newMode, 0);
    2. //...
    3. case DISP_CHANGE_BADMODE: // DISP_CHANGE_BADMODE = -2;
    4. Console.WriteLine("Mode not supported.");
    5. break;
    6. case DISP_CHANGE_FAILED: // DISP_CHANGE_FAILED = -1;
    7. default:
    8. Console.WriteLine("Failed, error code: {0}", result);
    9. break;


    PS: Wenn du DISP_CHANGE_BADMODE ausgegeben bekommst solltest du dir mal mit EnumDisplaySettings alle verfügbaren Modi ausgeben lassen. Ansonsten solltest du eine Fehlercode bekommen nach dem du googeln kannst.