#include #include // Ermittelt via DirectX die Bildschirmfrequenz des Monitors in Hz DWORD GetMonitorRefreshRate(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) { HINSTANCE hInstDDraw = NULL; LPDIRECTDRAW lpDD = NULL; __try { // 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); 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) { // 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. timeBeginPeriod(1); // Auflösung unter NT auf 1 ms setzen dwTime1 = timeGetTime(); Sleep(20); // Timer "einschwingen" 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 timeEndPeriod(1); // Aus der Dauer von fünf Bildern Vertikalfrequenz ermitteln if (dwTime2 > dwTime1) dwVRefresh = 5000 / (dwTime2 - dwTime1); // DirectDraw-Objekt freigeben lpDD->Release(); lpDD = NULL; } } // DirectDraw-Bibliothek freigeben FreeLibrary(hInstDDraw); hInstDDraw = NULL; } } __except (EXCEPTION_EXECUTE_HANDLER) { dwVRefresh = 0; if (lpDD != NULL) lpDD->Release(); if (hInstDDraw != NULL) FreeLibrary(hInstDDraw); } } return dwVRefresh; }