API GetLastInputInfo не работает, если для Windows установлено значение «Автоматический вход» - PullRequest
3 голосов
/ 27 мая 2011

Я использую вызов 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 отслеживается.Это применимо только тогда, когда код запускается из службы, а не из «пользовательского пространства» - он отлично работает во всех случаях, если выполняется из пользовательского пространства.

Тем не менее, я бы очень хотел найтирешение, которое работает из службы в каждом сценарии.

1 Ответ

4 голосов
/ 27 мая 2011

Возвращает 0 секунд, когда GetLastInput () возвращает FALSE.Что явно неверно.Вы не можете использовать подобный код в сервисе, у него нет способа получить пользовательский ввод.Если GetLastInput () когда-либо возвращает FALSE (вероятно, с автоматическим входом в систему), то он будет возвращать FALSE навсегда.

Если службы знают о пользовательских сессиях, это потерянная причина в Windows, служба работает в своей собственной сессиине нужно, чтобы пользователь вошел в систему.Что является основной причиной, чтобы использовать сервис в первую очередь.Вместо программы, которая запускается, скажем, с помощью ярлыка в папке «Автозагрузка».Этот код мог сработать случайно в XP, но он определенно не будет работать в Vista и Windows 7. Google "изоляция сеанса 0" для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...