Джон, ну это примерно как будильник. Система видит, что пользователь спит некоторое время, считает это время. А потом сама запускает Скринсервер. Вопрос чуть по другому поставлен. В любое время, даже когда скринсервер выключен, узнать сколько пользователь гуляет.
Есть одна идея. Но она только для своего потока будет действовать. Есть API функция
The GetMessageTime function returns the message time for the last message retrieved by the GetMessage function from the current thread's message queue. The time is a long integer that specifies the elapsed time, in milliseconds, from the time the system was started to the time the message was created (that is, placed in the thread's message queue).
LONG GetMessageTime(VOID)
Parameters
This function has no parameters.
Return Values
The return value specifies the message time.
Remarks
The return value from the GetMessageTime function does not necessarily increase between subsequent messages, because the value wraps to zero if the timer count exceeds the maximum value for a long integer.
To calculate time delays between messages, verify that the time of the second message is greater than the time of the first message; then, subtract the time of the first message from the time of the second message.
По ней можно узнать время последнего сообшения взятого из очереди потоком.
Берем время на данный момент, отнимаем время сообшения, и получаем время простоя. Но это будет работать, если только наше окно было активным. В Пассивном состоянии это будет неактуальным.