Я использую вызов Windows API для GetLastInputInfo, чтобы определить, находится ли система в режиме ожидания.Это работает практически в любом сценарии, кроме случаев, когда Windows настроена на обход имени пользователя / пароля и автоматического входа в систему.
В этом случае запрос GetLastInputInfo всегда возвращает 0. В обычных условиях он возвращает системный тик, когдапоследний ввод произошел.
Кто-нибудь знает почему?Или кто-нибудь знает альтернативный метод, чтобы определить, является ли сеанс Windows бездействующим?
РЕДАКТИРОВАТЬ
Это - то, как код написан, чтобы обнаружить текущий простой системы.Обнаружение происходит по таймеру, и независимо от того, как долго работает таймер, GetLastInputInfo всегда будет возвращать 0, в то время как Windows установлен в «автоматический вход».
long lastInputTicks = 0;
long idleTicks = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
if (GetLastInputInfo(ref lastInputInfo)) {
lastInputTicks = lastInputInfo.dwTime;
var systemUptime = GetTickCount();
idleTicks = systemUptime - lastInputTicks;
}
return new TimeSpan(0, 0, (int)(idleTicks / 1000));
Спасибо
ОБНОВЛЕНИЕ
Я подтвердил, что это происходит только потому, что код выполняется в службе.
Чтобы уточнить: при обычном сценарии, когда автоматический вход в систему не используется, пользователь входит в систему с консоли, и приведенный выше код - даже если он работает как служба - вернет надлежащее время бездействия пользователя..
Однако, если автоматический вход включен, то сеанс Windows, по-видимому, не запускается как обычный сеанс консоли, и поэтому NOT отслеживается.Это применимо только тогда, когда код запускается из службы, а не из «пользовательского пространства» - он отлично работает во всех случаях, если выполняется из пользовательского пространства.
Тем не менее, я бы очень хотел найтирешение, которое работает из службы в каждом сценарии.