| |
|
|
Sven Bader | Aus irgendeinem Grund funktionierte das Ändern der Bildschirmauflösung in meinen alten Spielen nicht mehr, sowohl mit der Windows API als auch mit der prospeed.dll nicht. Der herangehensweise ist normalerweise, die Bildschirmeinstellungen per EnumDisplaySettings zu holen und in dem Bereich nur die Werte für die Bildschirmauflösung anzupassen und alles andere unberührt zu lassen.
Zum Debuggen habe ich EnumDisplaySettings ausgeführt während ein anderes Spiel die Auflösung korrekt geändert hat. So kam ich darauf, dass mein Monitor die 60Hz Bildwiederholrate, welche bei 1920x1200 Standard sind bei 640x480 nicht unterstützt.
Mein Code ist auch nicht perfekt, er testet lediglich geläufige Bildwiederholraten und wählt bei einem Auflösungswechsel die höchste. "Exotische" Bildwiederholraten werden also nicht berücksichtigt.
Ein weiterer Fehler, der häufig begangen wird, ist die Fullscreen Flag &CDS_FULLSCREEN zu vergessen. Diese sagt aus, dass die Auflösung nicht dauerhaft für den Desktop-Einsatz sondern lediglich für die Dauer der Programmausführung geändert werden soll. So wird bei einem Programmabsturz oder unsauberen Beenden die ursprüngliche Auflösung des System wiederhergestellt. Ich meine, dass auch ein Effekt auf fremde Fenster (verkleinern) und das Verschieben von Desktop Icons so verhindert wird.
DEF EnumDisplaySettings(3) !"USER32","EnumDisplaySettingsA"
DEF ChangeDisplaySettings(2) !"USER32","ChangeDisplaySettingsA"
Declare devmode#,devmodeoriginal#,fehl&
Dim devmode#,148
Dim devmodeoriginal#, 148
Proc ChangeRes2021
Parameters x&, y&
declare hz&[8]
hz&[1] = 360
hz&[2] = 240
hz&[3] = 144
hz&[4] = 120
hz&[5] = 75
hz&[6] = 60
hz&[7] = 59
Def &CDS_UPDATEREGISTRY $00000001
Def &CDS_TEST $00000002
Def &CDS_FULLSCREEN $00000004
Def &CDS_GLOBAL $00000008
Def &CDS_SET_PRIMARY $00000010
Def &CDS_RESET $40000000
Def &CDS_SETRECT $20000000
Def &CDS_NORESET $10000000
if ((x& = 0) | (y& = 0))
ChangeDisplaySettings(devmodeoriginal#,0)
else
EnumDisplaySettings(0, -1 ,devmode#)
long devmode#,104=%BitsPixel
long devmode#,108=x&
long devmode#,112=y&
fehl& = -2
whileloop 7
long devmode#,120 = hz&[&loop]
fehl& = ChangeDisplaySettings(devmode#,&CDS_TEST)
if (fehl& = 0)
'messagebox Str$(hz&[&loop])+ "Hz is the highest working refresh rate","",0
fehl& = ChangeDisplaySettings(devmode#,&CDS_FULLSCREEN)
break
endif
endwhile
endif
Endproc
cls
ChangeRes2021(1024,768)
settimer 10000'nach 10 Sekunden wiederherstellen
waitinput
killtimer
end
|
|
|
| |
|
|