如何在Windows Service中检测系统空闲?

问题描述

GetLastInputInfo可以在应用程序上很好地工作,但不能在服务上工作。

GetLastInputInfo将始终在会话0上运行,因此始终返回LASTINPUTINFO.dwTime = 0。

如何在Windows Service中实现检测系统是否空闲?

解决方法

您的服务可以通过WTSEnumerateSessions()枚举活动会话,并通过WTSQuerySessionInformation()查询每个会话的WTSSessionInfo/Ex。这将为您提供每个会话的LastInputTime(以及其他功能)。

PWTS_SESSION_INFO sessions = NULL;
DWORD count = 0;

if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE,1,&sessions,&count))
{
    DWORD errCode = GetLastError();
    ...
}
else
{
    for (DWORD i = 0; i < count; ++i)
    {
        PWTSINFO info = NULL;
        DWORD size = 0;

        if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,sessions[i].SessionId,WTSSessionInfo,(LPWSTR*)&info,&size))
        {
            DWORD errCode = GetLastError();
            ...
        }
        else
        {
            // use info->LastInputTime as needed...
            WTSFreeMemory(info);
        }
    }
    WTSFreeMemory(sessions);
}

如果仅对连接到本地计算机的物理屏幕/键盘/鼠标的会话感兴趣,则可以使用WTSGetActiveConsoleSessionId()而不是WTSEnumerateSessions()