Блокировка выключения Windows 10 с помощью Python 3 - PullRequest
0 голосов
/ 22 февраля 2019

Можно ли как-то запретить Windows завершить работу моей системы с помощью Python.Таким образом, я не могу завершить работу своей системы, пока работает мой скрипт Python?

1 Ответ

0 голосов
/ 22 февраля 2019

Да, есть.

из документов Windows

Уведомления о завершении работы

Приложения с окном и очередью сообщений получают уведомления о завершении работы черезсообщения WM_QUERYENDSESSION и WM_ENDSESSION.Эти приложения должны возвращать TRUE, чтобы указать, что они могут быть прекращены.Приложения не должны блокировать отключение системы, если это не является абсолютно необходимым.Приложения должны выполнять любую необходимую очистку при обработке WM_ENDSESSION.Приложения, имеющие несохраненные данные, могут сохранить данные во временном местоположении и восстановить их при следующем запуске приложения.Приложениям рекомендуется часто сохранять свои данные и состояние;например, автоматическое сохранение данных между операциями сохранения, инициированными пользователем, чтобы уменьшить объем данных, которые должны быть сохранены при завершении работы.Консольные приложения получают уведомления о завершении работы в своих обработчиках.Чтобы зарегистрировать консольный обработчик, используйте функцию SetConsoleCtrlHandler.Приложения-службы получают уведомления о завершении работы в своих обработчиках.Чтобы зарегистрировать обработчик управления службами, используйте функцию RegisterServiceCtrlHandlerEx.

Блокировка выключения

Если приложение должно блокировать возможное отключение системы, оно может вызвать функцию ShutdownBlockReasonCreate.Вызывающая сторона предоставляет строку причины, которая будет отображаться пользователю.Строка причины должна быть короткой и четкой, предоставляя пользователю информацию, необходимую для принятия решения о том, продолжать ли выключение системы.

, поэтому вам необходимо перехватить сообщение WM_QUERYENDSESSION и вернуть False.

и, занимаясь поиском в Интернете, я нашел обсуждение того, как перехватить WM_QUERYENDSESSION в python:

если вы создали приложение с циклом обработки сообщений, вы можете получить сообщение WM_QUERYENDSESSION.Если вы хотите иметь GUI, большинство библиотек GUI, вероятно, обернут это по-своему.Если вам не нужен графический интерфейс, самое простое решение - использовать PyWin32.Где-то в документации есть учебник по созданию скрытого окна и написанию простого цикла сообщений.Просто сделайте это в основном потоке, и по-настоящему работайте с фоновым потоком, и сигнализируйте фоновому потоку, когда приходит сообщение WM_QUERYENDSESSION.

Или, что намного проще, просто используйте SetConsoleCtrlHandler (снова через PyWin32),Это также может поймать ^ C, ^ BREAK и пользователя, закрывающего вашу консоль, а также сообщения о выходе из системы и завершении работы, которые перехватывает WM_QUERYENDSESSION.Что еще более важно, он не требует цикла сообщений, поэтому, если у вас нет необходимости в этом, он намного проще.

Я не могу помочь с фрагментом кода, так как я надеваюУ меня нет доступа к Windows PC, и я не хочу делиться кодом без тестирования, но я надеюсь, что указал вам на то, что вы должны искать.

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