Mit der
nachfolgenden Funktion können Sie unter Win32 die Bildwiederholungsrate
des Monitors ermitteln.
#include <ddraw.h>
//
GetVerticalRefreshRate()
//
// Ermittelt die Bildwiederholungsrate des Monitors in Hz
//
DWORD
GetVerticalRefreshRate(void)
{
//
Bildwiederholungsrate via GetDeviceCaps ermitteln
// Der Index
VREFRESH wird nur von Windows NT unterstützt
HDC hdcScreen = GetDC(NULL);
DWORD dwVRefresh = GetDeviceCaps(hdcScreen,
VREFRESH);
ReleaseDC(NULL, hdcScreen);
// Wenn nicht
ermittelbar, Bildwiederholungsrate
// via DirectX
bestimmen.
if (dwVRefresh == 0 || dwVRefresh == 1)
{
// Zugriff auf
DirectDraw-Bibliothek via LoadLibrary
// und
GetProcAddress, da nicht sichergestellt ist,
// daß DirectX (min.
Version 1.0) vorhanden ist.
UINT uErrMode =
SetErrorMode(SEM_NOOPENFILEERRORBOX);
HINSTANCE hInstDDraw
= LoadLibrary("DDRAW.DLL");
SetErrorMode(uErrMode);
if
(hInstDDraw != NULL)
{
typedef
HRESULT (WINAPI *DIRECTDRAWCREATE)(GUID FAR *,
LPDIRECTDRAW FAR *, IUnknown FAR *);
DIRECTDRAWCREATE
DirectDrawCreate = (DIRECTDRAWCREATE)GetProcAddress(hInstDDraw,
"DirectDrawCreate");
if
(DirectDrawCreate != NULL)
{
LPDIRECTDRAW
lpDD;
// DirectDraw-Objekt
erzeugen
if
(SUCCEEDED(DirectDrawCreate(NULL, &lpDD, NULL)))
{
DWORD
dwTime1, dwTime2;
//
GetMonitorFrequency wird nicht von
// jedem
Grafiktreiber unterstützt
// lpDD->GetMonitorFrequency(&dwVRefresh);
// Zeit zwischen
den Austastlücken ermitteln.
// Aufgrund der
Timerauflösung fünf mal hintereinander.
lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND,
NULL);
dwTime1
= timeGetTime(); // Erster Meßpunkt
lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND,
NULL);
lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND,
NULL);
lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND,
NULL);
lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND,
NULL);
lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND,
NULL);
dwTime2
= timeGetTime(); // Zweiter Meßpunkt
// Aus der Dauer
von fünf Bildern
//
Vertikalfrequenz ermitteln
if
(dwTime2 > dwTime1)
dwVRefresh
= 5000 / (dwTime2 - dwTime1);
// DirectDraw-Objekt
freigeben
lpDD->Release();
}
}
// DirectDraw-Bibliothek
freigeben
FreeLibrary(hInstDDraw);
}
}
return
dwVRefresh;
}
[ refrate.cpp ]
[ <<
Vorheriger ] [ Übersicht ]
[ Nächster
>> ]
|