Visual C++ FAQ - Как определить, что запущен Screen Saver?

ОГЛАВЛЕНИЕ


Как определить, что запущен Screen Saver?

Если верить справочнику по Win32 API:
bool bIsSaverActive;
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bIsSaverActive, 0);
if (bIsSaverActive) { ... }
или
BOOL IsSaverRunning()
{ BOOL isNT;
OSVERSIONINFO ovi; ovi.dwOSVersionInfoSize=sizeof(ovi);
GetVersionEx(&ovi); isNT=(ovi.dwPlatformId==VER_PLATFORM_WIN32_NT);
if (!isNT)
{ UINT dummy, srunning=0;
BOOL res=SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,&srunning,0);
SystemParametersInfo(SPI_SCREENSAVERRUNNING,srunning,&dummy,0);
if (srunning==0) return FALSE; else return TRUE;
}
// это прекрасно рабоатет под '95. Но НТ могут быть проблемы
HWND hfw=GetForegroundWindow();
if (hfw==NULL) return TRUE;
LONG wl=GetWindowLong(hfw,GWL_STYLE);
if ((wl&0xF0000000)!=WS_POPUP|WS_VISIBLE) return FALSE;
RECT rc; GetWindowRect(hfw,&rc);
if (rc.right-rc.left!=GetSystemMetrics(SM_CXSCREEN) ||
rc.bottom-rc.top!=GetSystemMetrics(SM_CYSCREEN)) return FALSE;
return TRUE;
}