Запретить блокировку экрана Windows при игре с джойстиком

12

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

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

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

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

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

anishsane
источник
Да, это может быть достигнуто так, как вы предлагаете. Но вы проверили, можете ли вы переключать схемы питания? (Вместо изменения настроек плана электропитания.) Иногда в плане электропитания высокой производительности отключены функции энергосбережения. А также: если они заблокировали настройки вашего плана электропитания, оставили ли они разблокированными возможность устанавливать или запускать программное обеспечение, не авторизованное администраторами?
Miroxlav
«Иногда в высокопроизводительном плане электропитания отключены функции энергосбережения». Хорошая идея. Однако этот параметр применяется в качестве политики в настройках экранной заставки, а не в настройках плана электропитания. «оставляли ли они открытыми возможность устанавливать или запускать программное обеспечение, не авторизованное администраторами» В общем, да, но эти программы не могут изменять параметры, установленные политикой.
Anishsane
Кто-нибудь знает какой-либо Windows API, чтобы предотвратить блокировку экрана, который используют медиаплееры, такие как VLC, при воспроизведении видео?
Anishsane

Ответы:

1

Когда вы нажимаете клавишу на клавиатуре или перемещаете / щелкаете мышью, 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.

misha256
источник
0

Вы можете использовать SetThreadExecutionStateфункцию, предоставляемую модулем Python ctypes, как часть отдельного приложения 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 здесь .

Эрик Рид
источник
1
Вместо 0заполнителя стандартным способом является pass.
Anishsane
1
Кроме того, лучше не спать () вместо прохода. В противном случае, это будет занято - ждать и использовать процессор. Вы даже можете спать там часами.
Anishsane
0

Просто запустите файл с именем: no_sleep.vbs. Этот текстовый файл no_sleep.vbsдолжен содержать текстовое описание ниже.
Пожалуйста, Google, если вы не знаете, как создать пустой текстовый файл и переименовать его расширение.

set wsc = CreateObject("WScript.Shell")
Do
   'Five minutes
    WScript.Sleep(5*60*1000)
    wsc.SendKeys("{F13}")
Loop

Клавиша F13 не должна мешать настройкам игры

путешествие в Сахару
источник
Хм. Может сработать.
Anishsane