10

Моя система Windows 7 настроена на блокировку экрана после 20 минут бездействия (это политика на рабочем месте; я не могу изменить этот параметр).

Когда я использую клавиатуру / мышь, Windows обрабатывает их как пользовательский ввод, и, таким образом, экран остается разблокированным. Однако, когда я играю в любую игру, используя только джойстик, Windows воспринимает это как отсутствие активности, и, таким образом, экран блокируется по истечении времени ожидания.

Есть ли способ предотвратить блокировку экрана при использовании игр на основе джойстика?

Как обходной путь, я в настоящее время играю некоторое случайное видео (приглушенное) в фоновом режиме, используя VLC, который предотвращает блокировку экрана. Но должен быть лучший способ справиться с этой проблемой ...

Я мог бы написать скрипт, который бы имитировал некоторые нажатия клавиш, такие как {NUMLOCK}{NUMLOCK} через sendkeys. Тем не менее, всегда есть вероятность непреднамеренного побочного эффекта, например, запрета использования этих ключей в настройках игры.

2 ответа2

0

Вы можете использовать функцию SetThreadExecutionState , предоставляемую модулем ctypes Python, как часть автономного приложения Python, которое вы можете запустить в фоновом режиме и выйти с помощью Ctrl+C. (Спасибо за ответ @ misha256 за объяснение использования этой функции!)

import ctypes
from time import sleep

ES_CONTINUOUS        = 0x80000000
ES_SYSTEM_REQUIRED   = 0x00000001

# CONTINUOUS repeats the action until the application closes,
# SYSTEM_REQUIRED 'forces the system to be in the working state by resetting the system idle timer.'
ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)

# wait until broken
while True:
    # attempt to run the following code
    try:
        sleep(1) # thanks @anishsane
    except(KeyboardInterrupt): # catch a Ctrl+C
        break # stop waiting

Я построил этот скрипт для Windows. Посетите страницу релиза GitHub здесь.

0

Всякий раз, когда вы нажимаете клавишу на клавиатуре или перемещаете / щелкаете мышью, Windows сбрасывает таймер простоя. Вы можете вызвать функцию Windows API, которая точно так же сбрасывает таймер простоя. При регулярном вызове функции экранная заставка никогда не активируется и компьютер не блокируется. Это то, что делают VLC и другие приложения.

Имя функции SetThreadExecutionState находится в kernel32.dll . В VB фактический вызов выглядит так:

SetThreadExecutionState(ES_SYSTEM_REQUIRED Or ES_DISPLAY_REQUIRED)

Две константы:

ES_SYSTEM_REQUIRED = &H1 и ES_DISPLAY_REQUIRED = &H2

Вы не можете делать эти вызовы из VBScript, поэтому вам нужно что-то более продвинутое, чтобы кодировать это.

Кстати, вышесказанное является технически правильным способом сделать это. Многие утилиты, которые я видел в Интернете, используют глупые уловки, такие как имитация нажатий клавиш или покачивание мыши. На мой взгляд, это плохо, так как может помешать вашей работе.

Во всяком случае, я слишком отвлекся. Этот вид материала принадлежит Stack Overflow.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .