C # - Как обнаружить Windows завершение / выход из системы и отменить это действие (после запроса пользователя) - PullRequest
8 голосов
/ 06 января 2011

Некоторое объяснение: для проекта, над которым я работаю, мне нужно написать программу, которая работает в фоновом режиме, обнаруживает изменения в файлах и загружает измененные файлы в веб-сервис, чтобы сделать его доступным для других. Довольно простая синхронизация, если бы не было случая, когда пользователь изменяет большой файл и решает выключить компьютер сразу после редактирования.

Я мог бы отменить загрузку и подождать следующей перезагрузки, чтобы выполнить загрузку, но я могу представить, как пользователь загружает файл из Интернета на другой компьютер на следующее утро и не понимает, почему его изменения по сравнению с прошлой ночью ' т там.

Поэтому моя идея состояла в том, чтобы определить, когда пользователи выходят из системы или перезагружают Windows, и, если я нахожусь в процессе загрузки, просто спрашиваю пользователя: «Мы все еще синхронизируем файл Foo.txt, который вы только что изменили. Вы уверены, что хотите перезагрузить компьютер? Ваши изменения не будут доступны другим, пока вы не перезагрузите компьютер! ". Если пользователи говорят «нет», мне нужно отменить перезагрузку / выход из системы

Возможно ли это?

Ответы [ 3 ]

8 голосов
/ 06 января 2011

Существует статический класс с именем SystemEvents, который демонстрирует такое поведение:

http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx

Тем не менее, он не может различать определенные действия и не останавливает тайм-аут процесса ОС. Я использовал его один раз, но время ожидания по умолчанию, настроенное в реестре, немного мало, поэтому, вероятно, потребуется его увеличить.

Короче говоря, все это выглядело немного хакерским.

4 голосов
/ 06 января 2011

Чтобы добавить к ответу @ Adam, если вам необходимо определить разницу между выходом из системы и выключением / перезагрузкой, вы можете обработать сообщение WM_QUERYENDSESSION .

" Изменения выключенияWindows Vista"- полезная статья для понимания времени отключения.

3 голосов
/ 06 января 2011

Попытка заблокировать завершение работы в наши дни является делом с потерями, это больше невозможно сделать в Vista и выше. Подсказка не читается и не доступна. Использование службы очень важно здесь, позволяет вам пережить выход пользователя из системы. После перезагрузки ваш сервис снова запустится автоматически, что позволит вам завершить работу.

...