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.

    Hi

    Jetzt wäre vllt der richtige Zeitpunkt die qres.exe mal mit dem API Monitor zu untersuchen. Logge die entsprechenden APIs mit und werte die Parameter aus. Dann siehst du was die qres.exe an Parametern an die APIs mit gibt wenn Du die Auflösung damit änderst, die in Deinem Programm nicht funktioniert. Denke nur so kommst Du an entsprechende Infos warum die qres.exe da kein Problem hat.

    Edit: Da war doch noch eine Frage bezüglich der screeres.exe. Kann die die Auflösung einstellen oder nicht?
    Mfg -Franky-

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

    Moin moin

    Ich denke auch das qres das so machen könnte. Dazu müsste man aber die qres, bzw dessen verwendete APIs, überwachen um das heraus zu bekommen. Unsafe würde aber auch bedeuten das das eine Auflösung ist die evtl. auch Schäden am Monitor verursachen könnte. Nicht umsonst schlägt eine Auflösung fehl wenn die nicht sicher ist. Auf der anderen Seite kann es Windows ja auch. Hoffe das MS da nicht unsichere Auflösungen zulässt und diese evtl auch noch als bevorzugte Auflösung anpreist.
    Mfg -Franky-

    Takafusa schrieb:

    Schade, zumindest kommt schon mal eine korrekte Meldung(DISP_CHANGE_BADMODE) . Ich habe bei mir einen Loop laufen lassen, alle gehen. Ich hatte als ich im winuser Header geschaut habe was von UNSAFE flags gelesen, möglicherweise muss man damit was machen.
    Aus der winuser.h

    C-Quellcode

    1. /* Flags for ChangeDisplaySettings */
    2. #define CDS_UPDATEREGISTRY 0x00000001
    3. #define CDS_TEST 0x00000002
    4. #define CDS_FULLSCREEN 0x00000004
    5. #define CDS_GLOBAL 0x00000008
    6. #define CDS_SET_PRIMARY 0x00000010
    7. #define CDS_VIDEOPARAMETERS 0x00000020
    8. #if(WINVER >= 0x0600)
    9. #define CDS_ENABLE_UNSAFE_MODES 0x00000100
    10. #define CDS_DISABLE_UNSAFE_MODES 0x00000200
    11. #endif /* WINVER >= 0x0600 */
    12. #define CDS_RESET 0x40000000
    13. #define CDS_RESET_EX 0x20000000
    14. #define CDS_NORESET 0x10000000

    Versuch mal mit dieser Flag kombination
    erst testen
    WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_TEST or WinAPI.CDS_ENABLE_UNSAFE_MODES )
    dann übernehmen
    WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_UPDATEREGISTRY or WinAPI.CDS_ENABLE_UNSAFE_MODES )
    Versuch macht klug. Ich versuch dazu mal nähere Infos zu bekommen. Diese Unsafe flags stehen ab Vista zur Verfügung. Du kannst aber auch andere Flag Combos probieren. Einfach mal verschiede mit or reingeben in die Funktion.
    Du musst constanten aber in der WinAPI klasse eintragen. das 0x einfach durch &H ersetzen(keine angst wenn die führenden nullen hinterm &H verschwinden, das werden sie)


    Also ich hab die fehlenden Constanten hinzugefügt und dein Code als nextes getestet und alle flags genutzt leider kamen diese Fehlermeldung.

    Deine vorgeschlagene Parameter.
    Haben zu diesen Fehlern geführt.
    Meine ausprobierten auch.

    VB.NET-Quellcode

    1. Public Const DISP_CHANGE_BADFLAGS As Integer = -4


    Der rest wie davor.

    VB.NET-Quellcode

    1. Public Const DISP_CHANGE_BADMODE As Integer = -2


    Offenbar will das nicht wie wir uns das wünschen.

    @-Franky-
    Also ich glaube du machst ein kleinen Denkfehler nicht böse gemeint.

    Den Windows schlägt genau diese Auflösung ja als empfohlen vor und sie funktioniert ja.
    Wenn die Auflösung schaden würde dann hätte sich mein Bildschirm schon längst verabschiedet.
    Den die 1920x1080 ist die Standardeinstellung des Monitors die ich ja verwende die ganze Zeit.

    Weisste was auch seltsam ist solange ich auf diese Auflösung liege kann ich auch über mein tool die Frequenz problemlos ändern.
    War ich aber mal auf eine andere Auflösung egal welche. Dann lässt sich das damit nicht mehr zurückstellen.
    Nur noch mit externe exe oder Windows Boardmitteln.
    Verrückt oder?

    Naja wie auch immer werde aber das API Monitor Tool mal anschauen muss mich da erst mal zurecht finden da ich das noch nie benutzt habe.

    mfg.
    Xiantrius

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

    Xiantrius schrieb:

    Also ich glaube du machst ein kleinen Denkfehler nicht böse gemeint. Den Windows schlägt genau diese Auflösung ja als empfohlen vor und sie funktioniert ja. Wenn die Auflösung schaden würde dann hätte sich mein Bildschirm schon längst verabschiedet. Den die 1920x1080 ist die Standardeinstellung des Monitors die ich ja verwende die ganze Zeit.

    Dann hast Du mich vllt falsch verstanden. ;) Ich hoffe das Windows eben nicht unsafe Auflösungen als bevorzugte vorschlägt. Obwohl, bei MS weis man das ja nie. :)
    Mfg -Franky-
    Das kann ich dir nicht sagen wie Windows das macht.
    Ich weis nur das es funktioniert, aber die Zusammenhänge sind für mich unverständlich warum das bei mein Tool nicht ebenso funktioniert und das kann nicht sein das es nicht geht denn ich kann auch mit mein Tool noch folgende Auflösungen die noch Höher sind.
    2560x1440 Hz 144
    3200x1800 Hz 144
    3840x2160 Hz 120
    Nur möglich mit Port Kabel.
    HDMI unterstützt das nicht nur bis 1920x1080.
    Hi

    Kann ich Dir alles nicht beantworten und meine Glaskugel ist "out of order". Das ganze Rätselraten macht doch keinen Sinn. Das einzige was jetzt noch Sinn macht ist, logge die APIs, die die qres.exe verwendet, im API Monitor mit und schau welche Parameter welche Werte enthalten. Dann weist Du wie die qres.exe es schafft entsprechende Auflösungen einzustellen und dann programmiert man das genauso nach.

    Was macht meine Frage nach der screenres.exe aus dem GitHub Download? Schon ausprobiert?
    Mfg -Franky-

    -Franky- schrieb:


    Was macht meine Frage nach der screenres.exe aus dem GitHub Download? Schon ausprobiert?


    Ja da sind noch weniger möglichkeiten da kann man nur auflösung ändern ohne frequenz selbst als parameter zu geben, aber die Auflösung 1920x1080 nimmt er damit ebenfalls wie bei QRes an.
    Allerdings wählt screenres.exe die Frequenz automatisch auf 144hz kann das aber nicht selber entscheiden.
    Bei QRes geht es mit allen unterstützten hz mit der auflösung 1920x1080.
    Moin,

    Ich hab eben in den Source von screenres geschaut, keine Unsafe Flags. aber es gibt einen Unterschied. screenres testest nicht ob der Modus unterstützt ist. Wird einfach eingestellt.
    ChangeDisplaySettingsA(modeToSet, 0);
    Die 0 bedeutet "The graphics mode for the current screen will be changed dynamically." was auch immmer man sich darunter vorstellen darf.
    Auch das macht das Tool anders.
    modeToSet->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY ;
    Ich habe ja erst den Modus ausgelesen, bei dem Struct dann Werte verändert und damit ChangeDisplaySettings gecallt.
    Ich mach mal ein kleines Update in meinem Projekt, evtl. geht es dann. Aber vorher studiere ich noch einmal bei MS was es genau mit diesem Feld und Flags auf sich hat. Evtl. hab ich das was wichtige übersehen.

    @-Franky-
    Unsafe muss nicht automatisch bedeuten das dass schädlich für die Hardware ist. Evtl. könnte auch nur die Kommunikationen zwischen GPU und Monitor zusammenbrechen und muss dann neu aufgebaut werden, was aber auch nicht passieren muss. Leider haben wir keine Informationen dazu. Wenn man in C# unsafe methoden verwendet, bedeuted es ja auch nicht das da eine Gefahr für den PC(oder einzelnen beteiligten Komponenten) besteht, ja kein guter vergleich, aber unsafe muss nicht immer Gefährlich bedeuten.


    Nachtrag
    @Xiantrius
    Ich habe nun mal geschaut, ein bisschen was hinzugefügt, teste das mal wenn das nicht geht, mach noch was, spätestens dann sollte es gehen.
    Füge das in die WinAPI.vb hinzu:

    VB.NET-Quellcode

    1. Public Const DM_BITSPERPEL As Integer = &H40000
    2. Public Const DM_PELSWIDTH As Integer = &H80000
    3. Public Const DM_PELSHEIGHT As Integer = &H100000
    4. Public Const DM_DISPLAYFLAGS As Integer = &H200000
    5. Public Const DM_DISPLAYFREQUENCY As Integer = &H400000
    6. Public Const DM_POSITION As Integer = &H20


    Und ändere die Sub ChangeDisplaySettings

    VB.NET-Quellcode

    1. Private Sub ChangeDisplaySettings(width As UInteger, height As UInteger, frequency As UInteger)
    2. Dim mode As DEVMODEA = New DEVMODEA()
    3. mode.dmSize = CUShort(Marshal.SizeOf(mode))
    4. If WinAPI.EnumDisplaySettings(Nothing, WinAPI.ENUM_CURRENT_SETTINGS, mode) Then
    5. mode.dmPelsWidth = width
    6. mode.dmPelsHeight = height
    7. mode.dmDisplayFrequency = frequency
    8. mode.dmFields = WinAPI.DM_BITSPERPEL Or WinAPI.DM_PELSWIDTH Or WinAPI.DM_PELSHEIGHT Or WinAPI.DM_DISPLAYFLAGS Or WinAPI.DM_DISPLAYFREQUENCY
    9. Dim testResult As Integer = WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_TEST)
    10. Dim registryResult As Integer = Integer.MinValue
    11. Select Case testResult
    12. Case WinAPI.DISP_CHANGE_SUCCESSFUL
    13. registryResult = WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_UPDATEREGISTRY)
    14. Case WinAPI.DISP_CHANGE_RESTART
    15. MessageBox.Show("Das System muss zum übernehmen neu gestartet werden.")
    16. Return
    17. Case WinAPI.DISP_CHANGE_FAILED
    18. MessageBox.Show("Der Anzeigetreiber konnte den angegebenen Modus nicht einstellen.")
    19. Return
    20. Case WinAPI.DISP_CHANGE_BADMODE
    21. MessageBox.Show("Der Modus ist nicht unterstützt.")
    22. Return
    23. Case WinAPI.DISP_CHANGE_BADFLAGS
    24. MessageBox.Show("Ungültige Flags")
    25. Return
    26. Case WinAPI.DISP_CHANGE_BADPARAM
    27. MessageBox.Show("Ungültige Parameter")
    28. Return
    29. Case WinAPI.DISP_CHANGE_BADDUALVIEW
    30. MessageBox.Show("Die Änderung konnte nicht übernommen werden, da das System DualView-fähig ist.")
    31. Return
    32. End Select
    33. If registryResult <> Integer.MinValue Then
    34. Select Case registryResult
    35. Case WinAPI.DISP_CHANGE_SUCCESSFUL
    36. Case WinAPI.DISP_CHANGE_RESTART
    37. Case WinAPI.DISP_CHANGE_FAILED
    38. Case WinAPI.DISP_CHANGE_BADMODE
    39. Case WinAPI.DISP_CHANGE_BADFLAGS
    40. Case WinAPI.DISP_CHANGE_BADPARAM
    41. Case WinAPI.DISP_CHANGE_BADDUALVIEW
    42. End Select
    43. Else
    44. MessageBox.Show("Unbekannter Fehler!")
    45. End If
    46. End If
    47. End Sub


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

    Takafusa schrieb:

    Unsafe muss nicht automatisch bedeuten das dass schädlich für die Hardware ist. Evtl. könnte auch nur die Kommunikationen zwischen GPU und Monitor zusammenbrechen und muss dann neu aufgebaut werden, was aber auch nicht passieren muss.

    Da gebe ich Dir vollkommen recht. Kennt das noch wer wenn man eine Auflösung eingestellt hat die der Monitor nicht unterstützt das dann nur noch bunte Streifen zu sehen waren? Ok, ist schon ein paar Jahrzehnte her und da gab es noch CRT Monitore. :)

    Takafusa schrieb:

    Die 0 bedeutet "The graphics mode for the current screen will be changed dynamically." was auch immmer man sich darunter vorstellen darf.

    Meine Vorstellung davon ist, man muss den PC nicht neu starten damit die neuen Einstellungen übernommen werden, Halt dynamisch, also sofort.

    Takafusa schrieb:

    Auch das macht das Tool anders.

    Das wären Dinge, die man mit dem API Monitor evtl auch hätte auslesen können falls qres.exe diese ebenfalls verwendet.



    Mfg -Franky-

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

    Wie bekomme ich die API raus?

    Habe die DLL's in der QRes.exe gefunden und als neuen Prozess mit para durchlaufen lassen.
    Das tool ist mir noch recht neu und daher Entschuldigung wegen der Frage.
    Aber das Tool sieht interessant aus.


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

    -Franky- schrieb:

    CRT Monitore.


    Die alten Röhren :D . Gut das wir heute ohne diese Strahlungen auskommen. Ich glaub bis heute das die für den rückgang der Haarpracht der Informatiklehrer an meiner Schule verantwortlich war, 3 von 3 hatten das und die saßen dauernd vorm Bildschirm.

    @Xiantrius Teste doch bitte eben mein Update. wenn das nicht geht, bau ich das noch einmal um, dann muss das gehen. Aber ist VS Enterprise nicht ein bisschen teuer für ein Hobby programmierer?(Auf dem ScreenShot zu sehen) Ich komm seit eh und je mit den Express/Community Versionen aus.
    Hi

    Schaust Du Dir nochmal das Tutorial "API Monitor Tutorial: Monitoring your first application" -> rohitab.com/api-monitor-tutori…ng-your-first-application an. Da wird das Schritt für Schritt erklärt wie man da vorgeht. Wichtig! Die qres.exe dürfte ein 32bit Programm sein das dann entsprechend mit der 32bit Version vom API Monitor überwacht werden muss. Probiere das mal so aus, wie das im Tutorial mit der Notepad.exe gezeigt wird um ersteinmal zu verstehen wie das funktioniert. Danach kannst Du Dich der qres.exe widmen. Auf rohitab.com/apimonitor sind ganz viele Bilder die zeigen was in welchem Fenster dann zu sehen ist. Insbesondere der Teil "Decode Parameters and Return Values" ist interessant damit man nicht nur Zahlen, sondern auch die Namen der Konstanten usw lesen kann. Die verwendeten APIs, oder besser gesagt die verwendeten Funktionen einer DLL, der qres.exe siehst Du wenn Du die exe mit einem HEX-Viewer anschaust. Da hatte ich auch schon einen Screenshot zu gepostet.

    Edit: Könnte es sein das ich hier den Sourcecode von qres.exe gefunden habe? -> sourceforge.net/projects/qres/
    Mfg -Franky-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()

    Warum probierst du denn nicht den neuen Code aus? Wenn der nicht gehen sollte, weiss ich doch schon was noch zu machen wäre.
    Hab in der zwischenzeit nochmal überlegt, wenn das nun nicht gehen sollte, erstelle einfach ein neues DEVMODEA, weise Auflösungen und alles weitere zu, verwende die gleichen Flags für DEVMODEA.dwfields wie ich ich in dem Code nutze, teste nicht den Modus, sonder setzen den dann mit WinAPI CDS_NULL. Dann geht es auf jeden fall, denn der Code macht dann das gleiche wie die screenres nur halt mit frequenz. Also wenn dieser Code nicht geht, liegt es daran das rigendein Wert nicht passt, der aus der aktuellen konfig stammt, da es mit einem blanken DEVMODEA nur das nötigste zugewiesen in screenres klappt das ja auch. Nun mit anderen Tools zu hantieren um das Problem zu lösen sehe ich als Zeizverschwendung an.

    Ich werde das Projekt jetzt beenden denn es ist klar wie es funktioniert.

    VB.NET-Quellcode

    1. Private Sub ChangeDisplaySettings(width As UInteger, height As UInteger, frequency As UInteger)
    2. Dim mode As DEVMODEA = New DEVMODEA()
    3. mode.dmSize = CUShort(Marshal.SizeOf(mode))
    4. If WinAPI.EnumDisplaySettings(Nothing, WinAPI.ENUM_CURRENT_SETTINGS, mode) Then
    5. mode.dmPelsWidth = width
    6. mode.dmPelsHeight = height
    7. mode.dmDisplayFrequency = frequency
    8. mode.dmFields = WinAPI.DM_BITSPERPEL Or WinAPI.DM_PELSWIDTH Or WinAPI.DM_PELSHEIGHT Or WinAPI.DM_DISPLAYFLAGS Or WinAPI.DM_DISPLAYFREQUENCY
    9. Dim testResult As Integer = WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_TEST)
    10. Dim registryResult As Integer = Integer.MinValue
    11. Select Case testResult
    12. Case WinAPI.DISP_CHANGE_SUCCESSFUL
    13. registryResult = WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_UPDATEREGISTRY)
    14. Case WinAPI.DISP_CHANGE_RESTART
    15. MessageBox.Show("Das System muss zum übernehmen neu gestartet werden.")
    16. Return
    17. Case WinAPI.DISP_CHANGE_FAILED
    18. If WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_NULL) <> 0 Then
    19. MessageBox.Show("Der Anzeigetreiber konnte den angegebenen Modus nicht einstellen.")
    20. End If
    21. Return
    22. Case WinAPI.DISP_CHANGE_BADMODE
    23. If WinAPI.ChangeDisplaySettings(mode, WinAPI.CDS_NULL) <> 0 Then
    24. MessageBox.Show("Der Modus ist nicht unterstützt.")
    25. End If
    26. Return
    27. Case WinAPI.DISP_CHANGE_BADFLAGS
    28. MessageBox.Show("Ungültige Flags")
    29. Return
    30. Case WinAPI.DISP_CHANGE_BADPARAM
    31. MessageBox.Show("Ungültige Parameter")
    32. Return
    33. Case WinAPI.DISP_CHANGE_BADDUALVIEW
    34. MessageBox.Show("Die Änderung konnte nicht übernommen werden, da das System DualView-fähig ist.")
    35. Return
    36. End Select
    37. If registryResult <> Integer.MinValue Then
    38. Select Case registryResult
    39. Case WinAPI.DISP_CHANGE_SUCCESSFUL
    40. Case WinAPI.DISP_CHANGE_RESTART
    41. Case WinAPI.DISP_CHANGE_FAILED
    42. Case WinAPI.DISP_CHANGE_BADMODE
    43. Case WinAPI.DISP_CHANGE_BADFLAGS
    44. Case WinAPI.DISP_CHANGE_BADPARAM
    45. Case WinAPI.DISP_CHANGE_BADDUALVIEW
    46. End Select
    47. Else
    48. MessageBox.Show("Unbekannter Fehler!")
    49. End If
    50. End If
    51. End Sub


    Hier siehst du wie die Screenres das macht. Das solltest du auch mit VB können. Wobei die funtion findreolution nichts anderes macht, also eine Auflösung zu suchen die der gewünchten am nahesten kommt.
    Spoiler anzeigen

    C-Quellcode

    1. bool ResolutionManager::setResolution(string resolutionToSet)
    2. {
    3. DEVMODEA* modeToSet;
    4. try
    5. {
    6. modeToSet = m_findResolution(resolutionToSet);
    7. //std::cout << "Found resolution " << ": " << modeToSet->dmPelsWidth << "x" << modeToSet->dmPelsHeight << " " << modeToSet->dmDisplayFrequency << " " << modeToSet->dmBitsPerPel << " " << modeToSet->dmDisplayFlags << "\n";
    8. modeToSet->dmSize = sizeof(DEVMODEA);
    9. modeToSet->dmDriverExtra = 0;
    10. modeToSet->dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFLAGS | DM_DISPLAYFREQUENCY ;
    11. LONG retval = ChangeDisplaySettingsA(modeToSet, 0);
    12. if (retval != DISP_CHANGE_SUCCESSFUL)
    13. {
    14. return false;
    15. }
    16. }
    17. catch (...)
    18. {
    19. return false;
    20. }
    21. m_currentResolution = *modeToSet;
    22. return true;
    23. }


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Hi

    Ich weis das Du kein C++ lesen kannst. Das war eher für @Takafusa gedacht falls er Lust hat sich das mal anzuschauen.

    Ich habe mal, weil ich gerade etwas Zeit hatte, die qres.exe mit dem Parameter /L durch den API Monitor gejagt. So schaut das dann aus was der API Monitor für die API EnumDisplaySettingsA dann ausgibt. Den Rest müsstest dann selbst herausfinden was qres.exe macht, wenn die API ChangeDisplaySettingsA aufgerufen wird.
    Bilder
    • qres_API_Monitor.png

      210 kB, 1.920×1.040, 21 mal angesehen
    Mfg -Franky-
    Ich denke der Fehler war entweder das die Flags von DEVMODEA welches ich ja von der aktuellen konfig gehohlt habe nicht dem entsprachen die nötig waren. Hab das jetzt auch nicht debuggt.
    Wenn Xiantrius nun das macht was ich sagte, wird das funktionieren. Ist dann ja identisch mit dem was screenres macht, nur halt mit frequenz obendrauf.
    Wie gesagt, ich sehe die Lösung, wenn Xiantrius mich nicht unterstützt ihm zu helfen indem er mit 2 minuten arbeit den neuen Code testet, muss er nun selber mit der Anleitung von mir weitermachen. Hätte er getestet und es hätte nicht geklappt, hätte ich nur noch 2 minuten investierten müssen, dann wär's fertig gewesen.
    Ich habe hier jemand versprochen ein kleines WindowFramework in C++ zu preparieren für ein Tutorial, da setz ich mich jetzt dran. Ich arbeite nicht gern zeitgleich an mehreren Sachen, haut mich immer aus dem Komzept.

    @-Franky-
    das mit dem Source schau ich mir später auch noch mal an, vllt. finde ich da drin was im Zusammenhang mit dem Unsafe modes, das würde ich noch gern wissen.

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

    Also ich werde immer noch nicht schlauer dauert wohl bis ich das hinbekomme aber API hab ich gesehen.
    Trotzdem will es nicht.
    naja was solls.
    Ich danke für die hilfe bzw. den Versuch mir zu helfen.

    '@'Takafusa'
    Danke für den Code ich probier mal aus ob ich was draus machen kann so das es am ende doch funktioniert.

    mfg.
    Xiantrius

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

    Wenn es so nicht geht, lösche den Code in der Sub zum einstellen der Settings, erstelle dort ein neues DEVMODEA (ich hohlte ja von der aktuellen konfig), weise den entsprechen Feldern die Werte zu, also die breite, höhe, frequenz, weise auch dwFields die selben Flags zu wie ich, dann direkt ohne testen
    ChangeDisplaysettings(mode, WinAPI.CDS_NULL);
    Wird funktionieren, bin zu 95% sicher.