Zapobiegaj blokowaniu ekranu systemu Windows podczas gry joystickiem

12

Mój system Windows 7 jest ustawiony na blokowanie ekranu po 20 minutach bezczynności (jest to zasada obowiązująca w miejscu pracy; nie mogę zmienić tego ustawienia).

Kiedy korzystam z klawiatury / myszy, Windows traktuje je jako dane wejściowe użytkownika, a zatem ekran pozostaje odblokowany. Jednak gdy gram w dowolną grę przy użyciu wyłącznie joysticka, system Windows traktuje to jako brak aktywności, dlatego ekran zostaje zablokowany po upływie limitu czasu.

Czy istnieje sposób, aby zapobiec blokadzie ekranu podczas korzystania z gier opartych na joysticku?

Aby obejść ten problem, obecnie odtwarzam losowe wideo (wyciszone) w tle za pomocą VLC, co zapobiega blokowaniu ekranu. Ale powinien istnieć lepszy sposób na rozwiązanie tego problemu ...

Mógłbym napisać skrypt, który symulowałby niektóre naciśnięcia klawiszy, takie jak {NUMLOCK}{NUMLOCK}via sendkeys. Jednak zawsze istnieje możliwość niezamierzonego efektu ubocznego, takiego jak uniemożliwienie mi korzystania z tych klawiszy w opcjach gry.

anishsane
źródło
Tak, można to osiągnąć w sposób, który sugerujesz. Ale czy sprawdziłeś, czy możesz zmienić plany zasilania? (Zamiast zmiany ustawień planu zasilania.) Czasami plan zasilania o wysokiej wydajności ma wyłączone funkcje oszczędzania energii. A także: jeśli zablokowali ustawienia planu zasilania, czy pozostawili odblokowaną możliwość instalowania lub uruchamiania oprogramowania nieautoryzowanego przez administratorów?
miroxlav
„Czasami plan zasilania o wysokiej wydajności ma wyłączone funkcje oszczędzania energii” Dobry pomysł .. To ustawienie jest jednak egzekwowane jako zasada w ustawieniach wygaszacza ekranu, a nie w ustawieniach planu zasilania. „czy pozostawili odblokowaną możliwość instalowania lub uruchamiania oprogramowania nieautoryzowanego przez administratorów” Zasadniczo tak, ale oprogramowanie to nie może zmienić ustawień wymuszonych przez zasady.
anishsane
Czy ktoś wie o interfejsie API systemu Windows, aby zapobiec blokadzie ekranu, używanej przez odtwarzacze multimedialne takie jak VLC podczas odtwarzania filmów?
anishsane

Odpowiedzi:

1

Za każdym razem, gdy naciśniesz klawisz na klawiaturze lub przesuniesz / klikniesz myszą, system Windows resetuje licznik czasu bezczynności . Istnieje funkcja API systemu Windows, którą można wywołać, która resetuje licznik czasu bezczynności dokładnie w ten sam sposób. Wywołując funkcję w regularnych odstępach czasu, wygaszacz ekranu nigdy się nie aktywuje, a komputer nigdy się nie blokuje. To właśnie robią VLC i inne aplikacje.

Nazwa funkcji SetThreadExecutionStateznajduje się w kernel32.dll. W VB rzeczywiste połączenie wygląda następująco:

SetThreadExecutionState(ES_SYSTEM_REQUIRED Or ES_DISPLAY_REQUIRED)

Dwie stałe to:

ES_SYSTEM_REQUIRED = &H1 i ES_DISPLAY_REQUIRED = &H2

Nie możesz wykonywać tych wywołań z VBScript, więc potrzebujesz czegoś bardziej zaawansowanego, aby to zakodować.

Nawiasem mówiąc, powyższe jest technicznie poprawnym sposobem na zrobienie tego. Wiele narzędzi, które widziałem w Internecie, używa głupich sztuczek, takich jak symulowanie naciśnięć klawiszy lub poruszanie myszą. Moim zdaniem jest to złe, ponieważ może zakłócać twoją pracę.

W każdym razie za dużo dygresję. Tego rodzaju rzeczy należą do przepełnienia stosu.

misha256
źródło
0

Możesz użyć SetThreadExecutionStatefunkcji dostarczonej przez moduł ctypes Pythona, jako części samodzielnej aplikacji Python, którą możesz uruchomić w tle i wyjść z Ctrl + C. (Dzięki odpowiedzi @ misha256 za wyjaśnienie korzystania z tej funkcji!)

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

Zbudowałem ten skrypt dla systemu Windows. Odwiedź stronę wydania GitHub tutaj .

Eric Reed
źródło
1
Zamiast 0zastępczego standardowym sposobem jest pass.
anishsane,
1
Lepiej też zachować trochę sleep () zamiast pass. W przeciwnym razie zajmie to czekanie i zużyje procesor. Możesz nawet spać przez wiele godzin.
anishsane
0

Wystarczy uruchomić plik o nazwie: no_sleep.vbs. Ten plik tekstowy no_sleep.vbspowinien zawierać tekst poniżej.
Proszę google, jeśli nie wiesz, jak utworzyć pusty plik tekstowy i zmienić nazwę jego rozszerzenia.

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

Klawisz F13 nie powinien zakłócać opcji gry

podróż do Sahary
źródło
Hmm Powinno działać.
anishsane