Entwickler-Ecke
Windows API - Bildwiederholfrequenz auslesen / ändern
alexschultze - Sa 26.10.02 17:11
Titel: Bildwiederholfrequenz auslesen / ändern
hi
ich hab ein Programm, dass mithilfe von
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function change_resolution(width, height: word): boolean; var lpDevMode: TDeviceMode; begin Result := EnumDisplaySettings(nil, 0, lpDevMode); if Result then begin lpDevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; lpDevMode.dmPelsWidth := width; lpDevMode.dmPelsHeight := height; Result := ChangeDisplaySettings(lpDevMode, CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL; end; end; |
Wenn ich von 1024x768 auf 640xndere, sinkt die Bildwiederhilfrequenz extrem. (60 HZ glaub ich mal..)
Gibt es
a) eine Möglichkeit die Auslösung ohne BWH-Änderung umzustellen
b) Die BWH auszulesen und wieder einzustellen
alex
OregonGhost - Sa 26.10.02 18:57
a) Windows stellt beim Ändern der Auflösung die Bildwiederholfrequenz aus Sicherheitsgründen auf einen niedrigen, also sicheren Wert.
Du solltest dir im klaren sein, dass es ein Unterschied ist, ob du nur die Auflösung oder den Anzeigemodus änderst. Letzteres machst du mit ChangeDisplaySettings(). Ein Anzeigemodus besteht aus einer Auflösung (Breite, Höhe, Farbtiefe) und eben Bildwiederholfrequenz. Wenn du also noch bei TDeviceMode.dmFields noch DM_DISPLAYFREQUENCY hinzufügst und TDeviceMode.dmDisplayFrequency auf die neue Frequenz setzt, wird das gleich mit erledigt. Du kannst also hier auch einfach die alte Frequenz angeben. Beachte aber, dass zum Beispiel kaum ein Monitor 1024x768 mit 120 Hz anzeigen kann, wohl aber 640x480 mit 85 Hz.
b) Die aktuelle Bildwiederholfrequenz kannst du, wenn ich nicht irre, mit EnumDisplaySettings() auslesen, indem du ENUM_CURRENT_SETTINGS als zweiten Parameter übergibst.
alexschultze - Sa 26.10.02 19:19
ich habe nur vor, die BWH beizubehalten, egal ob sie 1024x768 oder 800x600 haben...
da geht nix kaputt ;)
am liebsten wäre mir ein kurzes COdebeispiel!
(vor allem mit dem bekommen der BWH)
OregonGhost - Fr 01.11.02 19:19
War schon länger nicht mehr hier, aber ein ungetestetes Codebeispiel bekommst du trotzdem:
Quelltext
1: 2: 3: 4: 5:
| var dm: TDevMode; ... dm.dmSize := sizeof(TDevMode); dm.dmDriverExtra := 0; EnumDisplaySettings(nil, ENUM_CURRENT_SETTINGS, @dm); |
Achtung: Borland deklariert sowas gerne anders. Wenn's nicht kompiliert, das @ einfach mal wegnehmen.
So, jetzt enthält dm.dmDisplayFrequency die aktuelle Bildwiederholfrequenz.
Diesen DEVMODE änderst du jetzt einfach ab, indem du die Member dmPelsWidth, dmPelsHeight und dmBitsPerPel änderst. Dann musst du das Member dmFields auf (DM_BITSPERPEL or DM_DISPLAYFREQUENCY or DM_PELSWIDTH or DM_PELSHEIGHT) setzen.
Und nun kannst du einfach wie gewohnt ChangeDisplaySettings() aufrufen. Ich empfehle als zweiten Parameter allerdings eine 0, aber da kommt's drauf an was du willst.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!