使用操纵杆玩游戏时防止 Windows 屏幕锁定

使用操纵杆玩游戏时防止 Windows 屏幕锁定

我的 Windows 7 系统设置为在 20 分钟不活动后锁定屏幕(这是工作场所强制执行的政策;我无法更改此设置)。

当我使用键盘/鼠标时,Windows 会将它们视为用户输入,因此屏幕保持解锁状态。但是,当我仅使用操纵杆玩任何游戏时,Windows 会将其视为无活动,因此屏幕在超时后被锁定。

有没有办法在使用基于操纵杆的游戏时防止屏幕锁定?

作为一种解决方法,我目前正在使用 VLC 在后台播放一些随机视频(静音),这可以防止屏幕锁定。但应该有更好的方法来解决这个问题...

我可以编写一个脚本,模拟一些按键,例如{NUMLOCK}{NUMLOCK}通过sendkeys。但是,这总是有可能产生意想不到的副作用,例如阻止我在游戏选项中使用这些键。

答案1

每当您按下键盘上的某个键,或者移动/单击鼠标时,Windows 都会重置其空闲计时器。您可以调用一个 Windows API 函数,以完全相同的方式重置空闲计时器。通过定期调用该函数,屏幕保护程序将永远不会激活,计算机也永远不会锁定。这就是 VLC 和其他应用程序所做的。

函数名称为SetThreadExecutionState,可在 中找到kernel32.dll。在 VB 中,实际调用如下所示:

SetThreadExecutionState(ES_SYSTEM_REQUIRED Or ES_DISPLAY_REQUIRED)

这两个常数是:

ES_SYSTEM_REQUIRED = &H1ES_DISPLAY_REQUIRED = &H2

您无法通过 VBScript 进行这些调用,因此您需要一些更高级的东西来编写代码。

顺便说一下,以上是技术上正确的这样做的方法。我在网上看到的许多实用程序都使用了一些愚蠢的技巧,比如模拟按键或摇动鼠标。在我看来,这很糟糕,因为它会干扰你的工作。

不管怎样,我已经跑题太多了。这类内容应该放在 Stack Overflow 上。

答案2

您可以将SetThreadExecutionStatePython 的 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 发布页面这里

答案3

只需运行一个名为的文件:no_sleep.vbs。此文本文件no_sleep.vbs应包含以下文本内容。
如果不知道如何创建空白文本文件并重命名其扩展名,请谷歌搜索。

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

F13 键不应干扰游戏选项

相关内容