问题
One solution that one could suggest is to periodically look for a special 'Screen-saver' desktop, and if it's present then count it as a running screensaver.
But apparently this is not the case for all screensavers as with some the mentioned desktop is always present.
Are there more reliable solutions for this?
回答1:
I think the key is to identify the screensaver by its window class ("WindowsScreenSaverClass"). I found this page How do I start, detect and stop screen savers? that has some code examples and explanations.
回答2:
See the WINAPI function SystemParametersInfo() with the SPI_GETSCREENSAVERRUNNING parameter. It's the only documented way to detect whether the screen saver is currently running. (You can also find out if a screen saver is even enabled, get and set the timeout value, and start the screen saver using this function.)
回答3:
HOW TO: Determine If Screen Saver Is Running by Using Visual Basic 6.0
I know this is for VB6, but it's bound to be a good place to start.
回答4:
This is my implementation of screen saver event detection.
Notes:
SPI_GETSCREENSAVERRUNNINGdetects Windows Event id 4802 and 4803 which weren't accurate in my case, see my problem hence user idle time calculation is addedGetLastInputInfoapparently doesn't work if process is a service.
回答5:
search processes for a process with .scr in its .MainModule.FileName
来源:https://stackoverflow.com/questions/510734/how-to-determine-that-a-screensaver-is-running