Joystick ile oynarken Windows ekran kilidini önleme


12

Windows 7 sistemim 20 dakika boyunca herhangi bir işlem yapılmadığında ekranı kilitleyecek şekilde ayarlanmış (bu, işyeri tarafından uygulanan bir politikadır; bu ayarı değiştiremiyorum).

Klavyeyi / fareyi kullanırken, Windows bunları kullanıcı girişi olarak kabul eder ve böylece ekran kilidi açık kalır. Ancak, sadece oyun çubuğu kullanarak herhangi bir oyun oynarken, Windows bunu bir etkinlik olarak görmez ve böylece zaman aşımından sonra ekran kilitlenir.

Joystick tabanlı oyunları kullanırken ekran kilidini önlemenin bir yolu var mı?

Geçici bir çözüm olarak, şu anda ekran kilidini önleyen VLC kullanarak arka planda bazı rastgele video (sessiz) oynuyorum. Ancak bu sorunu çözmenin daha iyi bir yolu olmalı ...

Muhtemelen {NUMLOCK}{NUMLOCK}via gibi bazı tuş vuruşlarını simüle edecek bir senaryo yazabilirim sendkeys. Ancak, oyun seçeneklerimde bu tuşları kullanmama engel olmak gibi, bunun istenmeyen bir yan etkisi olasılığı her zaman vardır.


Evet, önerdiğiniz şekilde elde edilebilir. Ancak güç planlarını değiştirip değiştiremeyeceğinizi kontrol ettiniz mi? (Güç planı ayarlarını değiştirmek yerine.) Bazen Yüksek Performanslı güç planında enerji tasarrufu özellikleri devre dışı bırakılır. Ve ayrıca: güç planı ayarlarınızı kilitlediyse, yöneticiler tarafından izin verilmeyen yazılımları yükleme veya çalıştırma yeteneğini açık bıraktılar mı?
miroxlav

"Bazen Yüksek Performanslı güç planında enerji tasarrufu özellikleri devre dışı bırakılır" İyi fikir .. Ancak, bu ayar güç planı ayarlarında değil, ekran koruyucu ayarlarında politika olarak uygulanır. "yöneticiler tarafından yetkilendirilmemiş yazılımları yükleme veya çalıştırma yeteneğini açık bıraktılar" Genel olarak, evet, ancak bu yazılımlar politika tarafından uygulanan ayarları değiştiremez.
anishsane

Herkes video oynatırken VLC gibi medya oynatıcıların kullandığı ekran kilidini önlemek için herhangi bir Windows API biliyor mu?
anishsane

Yanıtlar:


1

Klavyedeki bir tuşa bastığınızda veya fareyi hareket ettirdiğinizde / tıkladığınızda, Windows boşta kalma zamanlayıcısını sıfırlar . Boşta kalma zamanlayıcısını tamamen aynı şekilde sıfırlayan arayabileceğiniz bir Windows API işlevi vardır. Fonksiyonu düzenli aralıklarla çağırarak ekran koruyucu hiçbir zaman etkinleşmez ve bilgisayar asla kilitlenmez. VLC ve diğer uygulamalar bunu yapar.

İşlev adı bulunur SetThreadExecutionStateve içinde bulunur kernel32.dll. VB'de gerçek çağrı şöyle görünür:

SetThreadExecutionState(ES_SYSTEM_REQUIRED Or ES_DISPLAY_REQUIRED)

İki sabit:

ES_SYSTEM_REQUIRED = &H1 ve ES_DISPLAY_REQUIRED = &H2

Bu çağrıları VBScript'ten yapamazsınız, bu yüzden bunu kodlamak için daha gelişmiş bir şeye ihtiyacınız olacak.

Bu arada, yukarıdaki teknik olarak doğru yoludur. Web'de gördüğüm birçok yardımcı program, tuş vuruşlarını simüle etmek veya fareyi sallamak gibi aptalca numaralar kullanıyor. Bana göre bu kötü, çünkü çalışmanıza engel olabilir.

Her neyse, çok fazla araştırdım. Bu tür şeyler Stack Overflow'a aittir.


0

Bu SetThreadExecutionStateişlevi, Python'un ctypes modülünün sağladığı gibi, bağımsız bir Python uygulamasının parçası olarak arka planda çalıştırabilir ve Ctrl + C ile çıkabilirsiniz. (@ Misha256'nın bu fonksiyonun kullanımını açıklayan cevabı sayesinde!)

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

Bu komut dosyasını Windows için oluşturdum. GitHub bırakma sayfasını ziyaret edin burada .


1
Yer 0tutucu olarak standart yol budur pass.
anishsane

1
Ayrıca, geçiş yerine biraz uyku () tutmak daha iyidir. Aksi takdirde, meşgul bekleyecek ve CPU tüketecektir. Orada saatlerce uyuyabilirsiniz.
anishsane

0

Sadece adlı bir dosya çalıştırın no_sleep.vbs. Bu metin dosyası no_sleep.vbsaşağıdaki metin konusunu içermelidir.
Boş bir metin dosyasının nasıl oluşturulacağını ve uzantısının nasıl yeniden adlandırılacağını bilmiyorsanız lütfen google.

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

F13 tuşu oyun seçeneklerine müdahale etmemelidir


Hmm. Çalışabilir.
anishsane
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.