问题描述
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()
。