Как определить с помощью кода, как долго машина заблокирована?
Также приветствуются другие идеи за пределами C #.
Мне нравится идея службы Windows (и я ее принял) за простоту и чистоту, но, к сожалению, я не думаю, что она сработает для меня в данном конкретном случае. Я хотел запустить это на моей рабочей станции на работе, а не дома (или, я полагаю, в дополнение к дому), но он довольно жестко заблокирован благодаря любезности Министерства обороны. На самом деле, это одна из причин, по которой я катаю свой собственный.
Я все равно напишу это и посмотрю, работает ли. Спасибо всем!
Я бы создал службу Windows (тип проекта Visual Studio 2005), которая обрабатывает событие OnSessionChange, как показано ниже:
Что и как вы регистрируете активность в этот момент, зависит от вас, но служба Windows обеспечивает быстрый и легкий доступ к событиям Windows, таким как запуск, завершение работы, вход / выход, а также события блокировки и разблокировки.
источник
В приведенном ниже решении используется Win32 API. OnSessionLock вызывается, когда рабочая станция заблокирована, и OnSessionUnlock вызывается, когда она разблокирована.
источник
Я знаю, что это старый вопрос, но я нашел способ получить состояние блокировки для данного сеанса.
Я нашел свой ответ здесь, но он был на C ++, поэтому я перевел все, что мог, на C #, чтобы получить состояние блокировки.
Итак, вот и:
Примечание: приведенный выше код был извлечен из гораздо более крупного проекта, поэтому, если я пропустил, извините. У меня нет времени протестировать приведенный выше код, но я планирую вернуться через неделю или две, чтобы все проверить. Я разместил это сейчас только потому, что не хотел забыть это сделать.
источник
if (session_info_ex.Level != 1)
- при выполнении условия память не будет освобождаться. 2. если session_info_ex.Level! = 1, вам не следует этого делать:Marshal.PtrToStructure<WTSINFOEX>(ppBuffer);
поскольку размер возвращаемого буфера может отличаться от размера WTSINFOEXUInt32 Reserved;
вы должны полностью определить структуруWTSINFOEX_LEVEL1
. В этом случае компилятор выполнит правильное заполнение (выравнивание) полей внутри структуры. 4.WTSFreeMemoryEx
Здесь неправильно используется функция .WTSFreeMemory
должен использоваться вместо этого.WTSFreeMemoryEx
предназначен для освобождения памяти послеWTSEnumerateSessionsEx
.CharSet = CharSet.Auto
Должен использоваться во всех атрибутах.Если вы заинтересованы в написании службы Windows для «поиска» этих событий, у topshelf (библиотека / фреймворк, которая значительно упрощает написание служб Windows) есть ловушка.
а теперь код для подключения службы верхней полки к интерфейсу / конкретному выше
Все, что ниже, является "типичной" настройкой верхней полки .... кроме двух строк, которые я пометил как
/ * ЭТО ВОЛШЕБНАЯ СТРОКА * /
Это то, что запускает метод SessionChanged.
Я тестировал это с Windows 10 x64. Я заблокировал и разблокировал свою машину и получил желаемый результат.
Мой файл packages.config для подсказок о версиях:
источник
x.EnableSessionChanged();
вместе сServiceSessionChange
реализацией интерфейса, если вы реализовалиServiceControl
имплицитность экземпляра класса обслуживания и не создаете его. Нравитсяx.Service<ServiceImpl>();
. Вы должны реализоватьServiceSessionChange
вServiceImpl
классе:class ServiceImpl : ServiceControl, ServiceSessionChange
ПРИМЕЧАНИЕ : это не ответ, а (вклад) в ответ Тимоти Картера , потому что моя репутация пока не позволяет мне комментировать.
На всякий случай, если кто-то попробовал код из ответа Тимоти Картера и не заставил его работать сразу в службе Windows, есть одно свойство, которое необходимо установить
true
в конструкторе службы. Просто добавьте строку в конструктор:И убедитесь, что не устанавливали это свойство после запуска службы, иначе
InvalidOperationException
будет выдано сообщение.источник
Ниже приведен 100% рабочий код, чтобы узнать, заблокирован ли компьютер или нет.
Перед использованием этого используйте пространство имен
System.Runtime.InteropServices
.источник